perm filename DLNSER.XGP[DLN,MRC] blob
sn#374131 filedate 1978-08-14 generic text, type T, neo UTF8
/FONT#0=FIX20.FNT[XGP,SYS]
/BMAR=1
/TMAR=128
/RMAR=1699
/LMAR=128
/PMAR=2065
/XLINE=4
SAIL MRC 09:05:10 Monday, August 14, 1978 FQ+3D.9H.17M.15S.
DLNSER[S,SYS] Created 17:03 Sunday, August 13, 1978 FQ+2D.17H.15M.5S.
DDDDDDDDD LLL NNN NNN SSSSSSSSS EEEEEEEEEEEEEEE RRRRRRRRRRRR
DDDDDDDDD LLL NNN NNN SSSSSSSSS EEEEEEEEEEEEEEE RRRRRRRRRRRR
DDDDDDDDD LLL NNN NNN SSSSSSSSS EEEEEEEEEEEEEEE RRRRRRRRRRRR
DDD DDD LLL NNNNNN NNN SSS SSS EEE RRR RRR
DDD DDD LLL NNNNNN NNN SSS SSS EEE RRR RRR
DDD DDD LLL NNNNNN NNN SSS SSS EEE RRR RRR
DDD DDD LLL NNN NNN NNN SSS EEE RRR RRR
DDD DDD LLL NNN NNN NNN SSS EEE RRR RRR
DDD DDD LLL NNN NNN NNN SSS EEE RRR RRR
DDD DDD LLL NNN NNNNNN SSSSSSSSS EEEEEEEEEEEE RRRRRRRRRRRR
DDD DDD LLL NNN NNNNNN SSSSSSSSS EEEEEEEEEEEE RRRRRRRRRRRR
DDD DDD LLL NNN NNNNNN SSSSSSSSS EEEEEEEEEEEE RRRRRRRRRRRR
DDD DDD LLL NNN NNN SSS EEE RRR RRR
DDD DDD LLL NNN NNN SSS EEE RRR RRR
DDD DDD LLL NNN NNN SSS EEE RRR RRR
DDD DDD LLL NNN NNN SSS SSS EEE RRR RRR
DDD DDD LLL NNN NNN SSS SSS EEE RRR RRR
DDD DDD LLL NNN NNN SSS SSS EEE RRR RRR
DDDDDDDDD LLLLLLLLLLLLLLL NNN NNN SSSSSSSSS EEEEEEEEEEEEEEE RRR RRR
DDDDDDDDD LLLLLLLLLLLLLLL NNN NNN SSSSSSSSS EEEEEEEEEEEEEEE RRR RRR
DDDDDDDDD LLLLLLLLLLLLLLL NNN NNN SSSSSSSSS EEEEEEEEEEEEEEE RRR RRR
SAIL MRC 09:05:10 Monday, August 14, 1978 FQ+3D.9H.17M.15S.
DLNSER[S,SYS] Created 17:03 Sunday, August 13, 1978 FQ+2D.17H.15M.5S.
DLNSER[S,SYS] DLNDDB[S,SYS]
Switch Settings: L[FAIL] % C S 78V 120W X ↑
Fonts: F[FIX20.FNT[XGP,SYS],,]
␈↓& DLNSER[S,SYS] 08/14/78 Page 1␈↓'α
001 COMMENT ⊗ VALID 00030 PAGES
002 C REC PAGE DESCRIPTION
003 C00001 00001
004 C00004 00002 BEGIN DLNSER ↔ SUBTTL DLNSER Dialnet device service routines
005 C00006 00003 DLNMSG
006 C00008 00004 PKTCOP PKTCHN PKTOPC PKTSEQ PKTACK PKTSIZ PKTDAT PKTFDA PKTSDA PKTWNS
007 C00012 00005 PDBGET MAKPDB MAKPD1 MAKPD2 PDFILL REPFPL REPFLX
008 C00015 00006 CLRPDB FLSPDB
009 C00017 00007 DLNINI DLNIN1 DLNRLS DLDINI
010 C00020 00008 DLNINP DLILUP DLIDSC UUOTAB
011 C00023 00009 DLIMSG DLMLUP DLICLS DLIINR DLIEOF
012 C00026 00010 DLNOUT DLONEW DLOOLD DLOLUP DLOOUT DLOOUX
013 C00030 00011 DLNMTP DLNMDS
014 C00031 00012 DLNRPC DLRCON
015 C00034 00013 SNDNOP DLNRPA DLNRWN
016 C00036 00014 DLNCLS DLNWIN DLNEOF
017 C00039 00015 DLNINT DLNSTA DLNCWA
018 C00042 00016 DXHANG DLHANG DCWAIT DLWAIT DCWAKE DLWAKE
019 C00045 00017 GETARG NORPC DCHLUZ DLOUTQ DLOUQ1
020 C00048 00018 DLNCLK DLNCL1 DLNCL2
021 C00051 00019 RDPCKT RDPCKX RDPDAT
022 C00054 00020 RDPDUN RDPSIW RDPFAK RDPCKN RDPNRT
023 C00057 00021 RDPPAK RDPNPK RDPPK0 RDPNOP INTTAB
024 C00060 00022 RDPMSG RDPWIN RDPWN1 RDPINT RDPNAK REVPDB RDPERR
025 C00064 00023 RDPRPC RDRPC2 RDPCLS RDPCL1
026 C00067 00024 WRLIST WRLSTX WRPSOP
027 C00070 00025 WRPDAT WRPMOR WRPBKU
028 C00073 00026 DLNICH DLNOCH DLNOC1 DLNRCH DLNDIL DLNLGR CHKBYT
029 C00076 00027 SNDERR SNDERL SNDER1
030 C00078 00028 DLIINT DLOINT
031 C00081 00029 DLPINT DLHINT
032 C00083 00030 DLNBUG BADDLU
033 C00085 ENDMK
034 C⊗;
␈↓& DLNSER[S,SYS] 08/14/78 Page 2␈↓'α
001 BEGIN DLNSER ↔ SUBTTL DLNSER Dialnet device service routines
002 ; Mark Crispin, August '78
003
004 ; Aren't you glad you use Dialnet? Don't you wish everybody did?
005
006 IFN FTDLN,<
007
008 IFE FTDCA,<.FATAL FTDLN requires FTDCA>
009
010 HISYS
011
012 ; UUO dispatch table. I said it wasn't a standard device!
013
014 007 007 JRST DLNINI ; initialize
015 POPJ P, ; hung timeout(?)
016 007 028 ↑DLNDSP:JRST DLNRLS ; RELEASE
017 014 010 JRST DLNCLS ; CLOSE output
018 JRST UUOERR ; OUTPUT (can't happen)
019 JRST UUOERR ; INPUT (can't happen)
020 JRST UUOERR ; ENTER
021 JRST UUOERR ; LOOKUP
022 010 012 JRST DLNOUT ; dump mode OUTPUT
023 008 016 JRST DLNINP ; dump mode INPUT
024 JRST UUOERR ; USETO
025 JRST UUOERR ; USETI
026 JRST UUOERR ; UGETF
027 JRST UUOERR ; RENAME
028 POPJ P, ; CLOSE input (no-op)
029 JRST UUOERR ; UTPCLR
030 011 005 JRST DLNMTP ; MTAPE
␈↓& DLNSER[S,SYS] 08/14/78 Page 3␈↓'α
001 ;DLNMSG
002
003 ; Macro to generate a CTY message logging an interesting occurance
004 ; First argument is the message to be typed out; second is a one-byte
005 ; datum, third is an address of a byte pointer to a message which is
006 ; to be typed out in ASCII. This is intended for ERRs with string
007 ; messages. If this option is used the macro call must NOT be in
008 ; a literal!!
009
010 DEFINE DLNMSG (MESS,WD,PNTR) <
011 PUSHACS
012 IFDIF <WD><>,<PUSH P,WD>
013 LDB TAC,PUNIT
014 PUSH P,TAC
015 PUSHJ P,DISERR
016 [ASCIZ/DLN/]
017 DISARG LOC,<-1(P)>
018 [ASCIZ/: MESS/]
019 IFDIF <WD><>,<[ASCIZ/, Data /] ↔ DISARG LOC,<-2(P)>>
020 [ASCIZ/ /]
021 -1
022 ADJSP P,IFIDN <WD><><-1;>-2
023 IFDIF <PNTR><>,<
024 004 047 MOVE PDB,-17+PDB(P)
025 SKIPA AC2,PNTR
026 PUSHJ P,DISTYO
027 ILDB CHR,AC2
028 JUMPN CHR,.-2
029 PUSHJ P,DISMES
030 ASCIZ/ /
031 >;IFDIF
032 PUSHJ P,DISDATE
033 POPACS
034 >;DEFINE DLNMSG
␈↓& Dialnet definitions DLNSER[S,SYS] 08/14/78 Page 4␈↓'α
001 ;PKTCOP PKTCHN PKTOPC PKTSEQ PKTACK PKTSIZ PKTDAT PKTFDA PKTSDA PKTWNS
002
003 SUBTTL Dialnet definitions
004
005 ; ASCII definitions
006
007 %DLE←←220 ; Data Link Escape
008 %STX←←202 ; Start of TeXt
009 %ETX←←203 ; End of TeXt
010
011 004 009 IFN %ETX-<%STX+1>,<.FATAL DLNSER knows that %STX=%ETX+1>
012
013 ; Op code definitions
014
015 %NOP←←00 ; No-OPeration
016 %RPC←←01 ; Request Process Connection
017 %CLS←←02 ; CLoSe process connection
018 %WIN←←03 ; WINdow size
019 %MSG←←04 ; MeSsaGe
020 %NAK←←05 ; Negative AcKnowledge
021 %EOF←←06 ; End Of File
022 %INT←←07 ; INTerrupt
023 %ERR←←10 ; ERRor
024
025 002 001 IFN %NOP,<.FATAL DLNSER knows that %NOP=0>
026
027 ; Window size definitions, used for # of PDB's to allocate
028
029 ↑WINMIN←←=2 ; must be at least two windows
030 ↑WINDEF←←=5 ; default to 5 windows
031 ↑WINMAX←←=16 ; limit of 16. windows
032
033 ; Bits in DSTAT word of the DDB
034
035 DS%CON←←1 ; 1.1 → Connection open
036 DS%IEN←←2 ; 1.2 → I-level enabled
037 DS%IDL←←4 ; 1.3 → Output idle
038 DS%DLE←←10 ; 1.4 → DLE seen at DLIINT
039 DS%EOP←←20 ; 1.5 → RDPDUN to be run at EOP
040 DS%CCR←←40 ; 1.6 → carrier detect on this line
041 DS%ACN←←100 ; 1.7 → need to send acknowledgement
042 DS%ODE←←200 ; 1.8 → need to output an additional DLE
043
044 ; PDB definitions. Note that PDB's are in a two-way linked-list in DILIST,
045 ; DOLIST, and DXLIST, but only a one-way list in PDBFL.
046
047 PDB←←AC1 ; AC to use as PDB pointer (must be AC1)
048
049 PDBLNK←←0 ; previous PDB,,next PDB (must be first in the PDB)
050 004 049 PDBCNT←←PDBLNK+1 ; PDB I/O counter
051 004 050 PDBPNT←←PDBCNT+1 ; PDB I/O pointer
052 004 051 PDBCHK←←PDBPNT+1 ; packet checksum
053 004 052 PDBHDR←←PDBCHK+1 ; packet header, start of real packet
054 004 053 PDBDAT←←PDBHDR+1 ; first word of data
055 004 054 PDBSIZ←←PDBDAT+100 ; size of PDB
056
057 ; Pointers for snarfing things in the packet
058
059 004 047 PKTCOP: 331100,,PDBHDR(PDB) ; channel/op code
060 004 047 PKTCHN: 370500,,PDBHDR(PDB) ; channel
061 004 047 PKTOPC: 330400,,PDBHDR(PDB) ; op code
062 004 047 PKTSEQ: 221100,,PDBHDR(PDB) ; sequence number
063 004 047 PKTACK: 111100,,PDBHDR(PDB) ; acknowledgement
064 004 047 PKTSIZ: 001100,,PDBHDR(PDB) ; packet data size -1
065
066 004 047 PKTDAT: 441100,,PDBDAT(PDB) ; ILDB/IDPB pointer to data area
067 004 047 PKTFDA: 331100,,PDBDAT(PDB) ; first word in data area
068 004 047 PKTSDA: 221100,,PDBDAT(PDB) ; second word in data area
069
070 004 047 PKTWNS: 331100,,PDBDAT+2(PDB) ; pointer to window size in RPC
␈↓& Memory manglers DLNSER[S,SYS] 08/14/78 Page 5␈↓'α
001 ;PDBGET MAKPDB MAKPD1 MAKPD2 PDFILL REPFPL REPFLX
002
003 SUBTTL Memory manglers
004
005 ; PDBGET gets a PDB from free storage and clears it
006 ; PUSHJ P,PDBGET
007 ; <no core>
008 ; <return, PDB pointer in PDB>
009
010 004 055 PDBGET: MOVEI AC3,PDBSIZ
011 PUSHJ P,FSGET ; ask FS mangler for core
012 POPJ P, ; lost
013 004 047 SETZM (PDB) ; clear PDB we got
014 004 047 HRLI TAC,(PDB)
015 004 047 HRRI TAC,1(PDB)
016 004 047 BLT TAC,PDBSIZ-1(PDB)
017 JRST CPOPJ1
018
019 ; MAKPDB gets a PDB from free list or free storage. Note that the free
020 ; list is only lunk one-way (sigh).
021 ; PUSHJ P,MAKPDB
022 ; <no core>
023 ; <return, PDB pointer in PDB>
024
025 MAKPDB: CONO PI,SCNOFF
026 DLNDDB 002 061 SKIPN PDB,PDBFL ; get a PDB off the free list
027 JRST [ CONO PI,SCNON
028 005 010 PUSHJ P,PDBGET ; no list, try free storage
029 POPJ P,
030 DLNDDB 002 062 SKIPL PDBFLN ; need to replenish?
031 JRST CPOPJ1 ; no, just return
032 005 043 JRST PDFILL]
033 DLNDDB 002 061 MOVEI TAC1,PDBFL ; since one way, have to remember the previous
034 004 047 MAKPD1: SKIPN TAC,(PDB) ; try to find the last on the list
035 005 039 JRST MAKPD2 ; found it, exit the loop
036 004 047 MOVEI TAC1,(PDB) ; remember the previous
037 004 047 MOVEI PDB,(TAC) ; now get the current
038 005 034 JRST MAKPD1 ; continue running down the list
039 MAKPD2: SETZM (TAC1) ; remove it from the free list
040 CONO PI,SCNON
041 DLNDDB 002 062 SOSL PDBFLN
042 JRST CPOPJ1 ; free list filled or bloated, all done
043 004 047 PDFILL: PUSH P,PDB ; save PDB we're really going to use
044 005 050 PUSHJ P,REPFPL ; try to replenish free PDB list
045 004 047 POP P,PDB ; restore real PDB
046 JRST CPOPJ1
047
048 ; Here to replenish free PDB list
049
050 005 010 REPFPL: PUSHJ P,PDBGET
051 JRST [ MOVSI TAC,REPFPL; can't get one, put in a clock request
052 CONO PI,PIOFF ; to try again next tick
053 IDPB TAC,CLKQ
054 CONO PI,PION
055 POPJ P,]
056 REPFLX: CONO PI,SCNOFF ; here from CLRPDB with new PDB on stack
057 DLNDDB 002 061 EXCH PDB,PDBFL ; PDBFL ← new, PDB ← old
058 DLNDDB 002 061 MOVEM PDB,@PDBFL ; tack on rest of the list
059 CONO PI,SCNON
060 DLNDDB 002 062 AOSGE PDBFLN ; note one less block needed
061 005 050 JRST REPFPL ; still more to do
062 POPJ P,
␈↓& Memory manglers DLNSER[S,SYS] 08/14/78 Page 6␈↓'α
001 ;CLRPDB FLSPDB
002
003 ; CLRPDB returns a PDB to free storage, points PDB at the next. Barfs if
004 ; there was a previous to this PDB.
005 ; MOVEI PDB,<addr of PDB to release>
006 ; PUSHJ P,CLRPDB
007 ; <return, new PDB addr in PDB>
008
009 004 047 CLRPDB: TLNE PDB,-1
010 030 010 PUSHJ P,DLNBUG ; PDB should be remotely reasonable
011 004 047 SKIPN PDB
012 030 010 PUSHJ P,DLNBUG
013 CONO PI,SCNOFF
014 004 047 MOVE TAC,(PDB)
015 TLNE TAC,-1 ; barf if there was a previous
016 030 010 PUSHJ P,DLNBUG
017 SKIPE TAC ; if it was in a list
018 HRRZS (TAC) ; unlink it from the list
019 CONO PI,SCNON
020 PUSH P,TAC ; put new one on stack
021 DLNDDB 002 062 SKIPL PDBFLN ; does the free list want any?
022 JRST [ PUSHJ P,FSGIVE ; no, give it back
023 004 047 POP P,PDB
024 POPJ P,]
025
026 ; Here if the list wants some more PDB's, give this one to it and try to
027 ; replenish it while we're at it.
028
029 004 047 SETZM (PDB) ; PDBFL wants some, clear out old cruft
030 004 047 HRLI TAC,(PDB)
031 004 047 HRRI TAC,1(PDB)
032 004 047 BLT TAC,PDBSIZ-1(PDB)
033 005 056 PUSHJ P,REPFLX ; call the replenisher at special entry point
034 004 047 POP P,PDB
035 POPJ P,
036
037 ; Here to release a PDB list. I-level must be disabled.
038
039 004 047 FLSPDB: HLRZ TAC,(PDB) ; run down list until find the first
040 006 039 JUMPN TAC,[MOVEI PDB,(TAC) ↔ JRST FLSPDB]
041 006 009 PUSHJ P,CLRPDB ; and flush the entire list
042 004 047 JUMPN PDB,.-1
043 POPJ P,
␈↓& UUO routines DLNSER[S,SYS] 08/14/78 Page 7␈↓'α
001 ;DLNINI DLNIN1 DLNRLS DLDINI
002
003 SUBTTL UUO routines
004
005 ; System initialization
006
007 DLNINI: MOVNI TAC,DLNNUM ; one spare for each port
008 DLNDDB 002 062 MOVEM TAC,PDBFLN
009 005 025 PUSHJ P,MAKPDB ; make an initial PDB
010 030 010 PUSHJ P,DLNBUG ; no core at system initialization time?
011 006 009 PUSHJ P,CLRPDB ; free it (didn't really want it to begin with)
012 PUSH P,DDB ; I'm paranoid
013 MOVSI TAC,-DLNNUM
014 DLNDDB 002 057 DLNIN1: MOVE DDB,DLNUTB(TAC) ; get DDB for this unit
015 PUSH P,TAC
016 007 043 PUSHJ P,DLDINI ; initialize the DDB
017 POP P,TAC
018 007 014 AOBJN TAC,DLNIN1 ; loop through for each DDB
019 POP P,DDB
020 018 010 MOVE TAC,[DLNCLK,,5*JIFSEC] ; every 5 seconds
021 CONO PI,PIOFF
022 IDPB TAC,CLOCK(PID) ; we have a checkpoint
023 CONO PI,PION
024 POPJ P,
025
026 ; RELEASE UUO
027
028 DLNDDB 002 030 DLNRLS: SETZM DSTAT(DDB) ; clear DS%IEN bit to turn off I-level
029 DLNDDB 002 038 SKIPE PDB,DILIST(DDB) ; flush input list
030 006 039 PUSHJ P,FLSPDB
031 DLNDDB 002 039 SKIPE PDB,DOLIST(DDB) ; and output list
032 006 039 PUSHJ P,FLSPDB
033 DLNDDB 002 040 SKIPE PDB,DXLIST(DDB) ; and pending acknowledgement list
034 006 039 PUSHJ P,FLSPDB
035 DLNDDB 002 036 SKIPE PDB,UUOPDB(DDB) ; flush UUO PDB if any
036 006 009 PUSHJ P,CLRPDB
037 DLNDDB 002 037 SKIPE PDB,INTPDB(DDB) ; ditto for interrupt PDB's
038 006 009 PUSHJ P,CLRPDB
039 ; JRST DLDINI ; now init the DDB
040
041 ; Here to initialize a DDB and the DDB's port
042
043 DLDINI: LDB TAC,PUNIT
044 PUSHJ P,DLNHNG ; hang up the modem
045 LDB TAC,PUNIT
046 LSH TAC,=12
047 IOR TAC,[DLNPKU,,5*JIFSEC] ; enable DTR after 5 seconds
048 CONO PI,PIOFF
049 IDPB TAC,CLOCK(PID)
050 CONO PI,PION
051 DLNDDB 002 029 SETZM DFWC(DDB) ; clear DDB
052 DLNDDB 002 029 HRLI TAC,DFWC(DDB)
053 DLNDDB 002 029 HRRI TAC,DFWC+1(DDB)
054 DLNDDB 002 048 BLT TAC,DLWC(DDB)
055 SETZM DEVIOS(DDB) ; clear IOS
056 004 029 MOVEI TAC,WINMIN ; set up minimum window size
057 004 029 MOVEI TAC1,WINMIN
058 DLNDDB 002 034 DMOVEM TAC,DIWS(DDB)
059 DLNDDB 002 041 DMOVEM TAC,DIWIN(DDB)
060 MOVEI TAC,CPOPJ ; output interrupt dispatch
061 DLNDDB 002 031 MOVEM TAC,DIDS(DDB)
062 DLNDDB 002 032 MOVEM TAC,DODS(DDB)
063 004 037 MOVEI TAC,DS%IEN!DS%IDL ; flag output I-level as idle and
064 DLNDDB 002 030 MOVEM TAC,DSTAT(DDB) ; allow I-level to work again
065 POPJ P,
␈↓& UUO routines DLNSER[S,SYS] 08/14/78 Page 8␈↓'α
001 ;DLNINP DLILUP DLIDSC UUOTAB
002
003 ; INPUT UUO and UUO-level opcode processing
004 ;
005 ; Receive data
006 ; INPUT chn,block
007 ; ...
008 ; block:byte pointer to data buffer
009 ; number of data bytes
010 ; data channel
011 ;
012 ; Also handle command packets which should be processed in the data stream.
013 ; This includes things like EOF, or CLS, which are conditions which want to
014 ; be raised only after previous packets have been processed.
015
016 004 035 DLNINP: MOVEI TAC,DS%CON
017 DLNDDB 002 030 TDNN TAC,DSTAT(DDB) ; insist on open connection
018 017 016 JRST NORPC
019 017 006 PUSHJ P,GETARG ; snarf user args
020 JUMPLE AC2,CPOPJ
021 XCTR XRW,[MOVES 2(UUO)] ; check channel writeability
022 DLNDDB 002 038 DLILUP: SKIPN PDB,DILIST(DDB) ; get PDB from the list
023 016 013 PUSHJ P,DLHANG
024 004 061 LDB TAC,PKTOPC
025 008 049 CAIGE TAC,OPMAX ; legal opcode?
026 008 040 XCT UUOTAB(TAC) ; yes, dispatch to appropriate server
027 030 010 PUSHJ P,DLNBUG ; undef opcode?
028
029 ; Remove PDB from input list and discard it.
030
031 DLNDDB 002 041 DLIDSC: AOS DIWIN(DDB) ; open up that space in the window
032 CONO PI,SCNOFF
033 004 047 MOVE TAC,PDBLNK(PDB) ; get the next
034 DLNDDB 002 038 MOVEM TAC,DILIST(DDB) ; make it the current now
035 004 049 HRRZS PDBLNK(TAC) ; unbind old PDB from list
036 006 009 JRST CLRPDB ; does CONO PI,SCNON and returns
037
038 ; UUO-level packet type dispatch table
039
040 UUOTAB: CAI ; %NOP
041 CAI ; %RPC
042 009 028 JRST DLICLS ; %CLS
043 CAI ; %WIN
044 009 007 JRST DLIMSG ; %MSG
045 CAI ; %NAK
046 009 041 JRST DLIEOF ; %EOF
047 009 040 JRST DLIINR ; %INT
048 CAI ; %ERR
049 008 040 OPMAX←←.-UUOTAB
␈↓& UUO routines DLNSER[S,SYS] 08/14/78 Page 9␈↓'α
001 ;DLIMSG DLMLUP DLICLS DLIINR DLIEOF
002
003 ; Individual opcode handlers
004
005 ; MSG -- stuff user buffer
006
007 004 060 DLIMSG: LDB TAC,PKTCHN ; get its channel
008 XCTR XR,[CAME TAC,2(UUO)] ; same as channel user wanted?
009 JRST [ XCTR XW,[MOVEM TAC,2(UUO)]
010 POPJ P,] ; tell user the channel changed
011 004 047 DLMLUP: SOSGE PDBCNT(PDB) ; anything in this PDB?
012 JRST [ XCTR XW,[MOVEM AC3,(UUO)]
013 XCTR XW,[MOVEM AC2,1(UUO)]
014 008 031 PUSHJ P,DLIDSC ; discard this PDB
015 017 006 PUSHJ P,GETARG ; retrieve pointer AC's
016 008 022 JRST DLILUP]
017 004 047 ILDB TAC,PDBPNT(PDB) ; get buffer byte
018 XCTR XDB,[IDPB TAC,AC3] ; give user data byte
019 009 011 SOJG AC2,DLMLUP
020 XCTR XW,[MOVEM AC3,(UUO)] ; return updated args to user
021 XCTR XW,[MOVEM AC2,1(UUO)]
022 004 047 SKIPG PDBCNT(PDB) ; if this PDB is spent
023 008 031 JRST DLIDSC ; discard it first
024 POPJ P, ; all done
025
026 ; CLS -- set IODERR, IODEND, clear DS%CON and return to user
027
028 004 047 DLICLS: PUSH P,PDB
029 014 010 PUSHJ P,DLNCLS ; send return CLS
030 004 047 POP P,PDB
031 DLNDDB 002 033 SETZM DPID(DDB) ; clear PID
032 DLNDDB 002 033 SETZM DPID+1(DDB)
033 MOVEI IOS,IODERR!IODEND ; and wake user up to the bad news
034 IORB IOS,DEVIOS(DDB)
035 008 031 JRST DLIDSC ; discard PDB and return
036
037 ; EOF -- set IODEND and return to user
038 ; INT -- set IOIMPM (I couldn't think of anything better to use)
039
040 DLIINR: TROA IOS,IOIMPM
041 DLIEOF: MOVEI IOS,IODEND ; tell user EOF happened
042 IORB IOS,DEVIOS(DDB) ; happy UUOCON
043 004 060 LDB TAC,PKTCHN ; gobble down channel number
044 XCTR XW,[MOVEM TAC,2(UUO)] ; pass it to user
045 008 031 JRST DLIDSC
␈↓& UUO routines DLNSER[S,SYS] 08/14/78 Page 10␈↓'α
001 ;DLNOUT DLONEW DLOOLD DLOLUP DLOOUT DLOOUX
002
003 ; OUTPUT UUO
004 ;
005 ; Send data
006 ; OUTPUT chn,block
007 ; ...
008 ; block:byte pointer to data buffer
009 ; number of data bytes
010 ; data channel
011
012 004 035 DLNOUT: MOVEI TAC,DS%CON
013 DLNDDB 002 030 TDNN TAC,DSTAT(DDB) ; insist it be connected
014 017 016 JRST NORPC
015 DLNDDB 002 033 SKIPN DPID(DDB) ; case of closed but picked up again
016 DLNDDB 002 033 SKIPE DPID+1(DDB) ; (which cleared IODERR)
017 TRNE IOS,IODERR ; is connection closing?
018 POPJ P, ; yes, don't let it through
019 DLNDDB 002 036 SKIPE PDB,UUOPDB(DDB) ; get last output PDB
020 010 032 JRST DLOOLD
021 005 025 DLONEW: PUSHJ P,MAKPDB ; none, make one
022 030 010 PUSHJ P,DLNBUG ; no core at UUO level?
023 DLNDDB 002 036 MOVEM PDB,UUOPDB(DDB)
024 XCTR XRW,[MOVES TAC,2(UUO)] ; data channel
025 004 060 DPB TAC,PKTCHN
026 MOVEI TAC,=256 ; empty packet
027 004 047 MOVEM TAC,PDBCNT(PDB)
028 004 066 MOVE TAC,PKTDAT ; data pointer
029 004 047 MOVEM TAC,PDBPNT(PDB)
030 004 019 MOVEI TAC,%MSG ; MSG type packet
031 004 061 DPB TAC,PKTOPC
032 017 006 DLOOLD: PUSHJ P,GETARG
033 JUMPLE AC2,CPOPJ
034 004 060 LDB TAC,PKTCHN ; get packet's channel
035 XCTR XR,[CAMN TAC,2(UUO)]
036 004 047 DLOLUP: SOSGE PDBCNT(PDB) ; any space in this PDB?
037 JRST [XCTR XW,[MOVEM AC3,(UUO)]
038 XCTR XW,[MOVEM AC2,1(UUO)]
039 DLNDDB 002 042 SKIPG DOWIN(DDB)
040 016 013 PUSHJ P,DLHANG ; if window full, do checking hang
041 010 064 PUSHJ P,DLOOUX ; wrong channel or full, output it and start over
042 017 006 PUSHJ P,GETARG
043 JUMPG AC2,DLONEW; loop back if more
044 POPJ P,]
045 XCTR XLB,[ILDB TAC,AC3] ; get user data byte
046 004 047 IDPB TAC,PDBPNT(PDB) ; store in our buffer
047 010 036 SOJG AC2,DLOLUP
048 XCTR XW,[MOVEM AC3,(UUO)] ; return updated args to user
049 XCTR XW,[MOVEM AC2,1(UUO)]
050 004 047 SKIPE PDBCNT(PDB) ; is PDB full?
051 POPJ P, ; no, return to user--we're done
052
053 ; Here to output a PDB. Also called as MTAPE 5 (force out buffer)
054
055 DLNDDB 002 036 DLOOUT: SKIPN PDB,UUOPDB(DDB) ; get PDB
056 POPJ P, ; no PDB, just return
057 DLNDDB 002 033 SKIPN DPID(DDB) ; case of closed but picked up again
058 DLNDDB 002 033 SKIPE DPID+1(DDB) ; (which cleared IODERR)
059 TRNE IOS,IODERR ; is connection closing?
060 DLNDDB 002 036 JRST[SETZM UUOPDB(DDB)
061 006 009 JRST CLRPDB] ; yes, don't let it through
062 DLNDDB 002 042 SKIPG DOWIN(DDB) ; window still open?
063 016 007 PUSHJ P,DXHANG ; wait or abort if so
064 DLNDDB 002 036 DLOOUX: SETZM UUOPDB(DDB) ; no longer any "old" PDB
065 MOVEI TAC,=255
066 004 047 SKIPLE PDBCNT(PDB)
067 004 047 SUB TAC,PDBCNT(PDB) ; TAC ← # of bytes in this packet -1
068 006 009 JUMPL TAC,CLRPDB ; just in case packet is empty
069 004 064 DPB TAC,PKTSIZ
070 017 026 JRST DLOUTQ ; output the PDB
␈↓& UUO routines DLNSER[S,SYS] 08/14/78 Page 11␈↓'α
001 ;DLNMTP DLNMDS
002
003 ; MTAPE UUO dispatch
004
005 DLNMTP: XCTR XR,[SKIPL TAC,(UUO)] ; get function code
006 011 018 CAIL TAC,DLNMMX
007 JRST UUOERR ; illegal function
008 011 010 JRST @DLNMDS(TAC) ; else dispatch to server
009
010 012 014 DLNMDS: DLNRPC ; 0 request connection
011 014 010 DLNCLS ; 1 close connection
012 014 035 DLNWIN ; 2 set window size
013 014 056 DLNEOF ; 3 end of file
014 015 009 DLNINT ; 4 interrupt
015 010 055 DLOOUT ; 5 force out buffer
016 015 035 DLNSTA ; 6 return status bits
017 015 054 DLNCWA ; 7 wait for connection to complete
018 011 010 DLNMMX←←.-DLNMDS
␈↓& UUO routines DLNSER[S,SYS] 08/14/78 Page 12␈↓'α
001 ;DLNRPC DLRCON
002
003 ; Send RPC (request process connection)
004 ; MTAPE chn,block
005 ; <error--dialing failed, error code in block>
006 ; <won>
007 ; ...
008 ; block:0
009 ; first 4 9-bit bytes of process ID
010 ; last 4 9-bit bytes of process ID
011 ; window wize
012 ; phone number in ASCIZ (up to 4 words)
013
014 004 035 DLNRPC: MOVEI TAC,DS%CON
015 DLNDDB 002 030 TDNE TAC,DSTAT(DDB)
016 JRST [ JSP TAC,UUOMES
017 ASCIZ/Dialnet RPC with connection open, UUO/]
018 DLNDDB 002 033 DMOVE TAC,DPID(DDB) ; see if want an acceptance
019 XCTR XR,[DMOVE AC2,1(UUO)] ; get PID
020 SKIPN TAC
021 012 027 JUMPE TAC1,DLRCON
022 SKIPN AC2 ; want an accept, so a PID is illegal
023 013 014 JUMPE AC3,DLNRPA
024 JSP TAC,UUOMES
025 ASCIZ/Connect RPC on a busy Dialnet port, UUO/
026
027 DLRCON: SKIPN AC2 ; want a connect, insist upon a PID
028 JUMPE AC3,[ JSP TAC,UUOMES
029 ASCIZ/Accept RPC on an idle Dialnet port, UUO/]
030 XCTR XR,[SKIPN 4(UUO)]
031 013 014 JRST DLNRPA ; user doesn't want to dial
032 004 040 MOVEI TAC,DS%CCR
033 DLNDDB 002 030 TDNN TAC,DSTAT(DDB) ; connected already?
034 JRST [ JSP TAC,UUOMES
035 ASCIZ/Attempt to dial while already dialed, UUO/]
036 004 037 MOVEI TAC,DS%IDL
037 DLNDDB 002 030 TDNN TAC,DSTAT(DDB) ; output program must be idle
038 030 010 PUSHJ P,DLNBUG
039 LDB TAC,PUNIT ; hang up line first
040 PUSHJ P,DLNHNG
041 016 026 PUSHJ P,DCWAIT ; wait for 3 second wakeup
042 LDB TAC,PUNIT ; re-enable DTR
043 PUSHJ P,DLNPKU
044 026 021 MOVEI TAC,DLNRCH ; read a character at I-level
045 DLNDDB 002 031 MOVEM TAC,DIDS(DDB)
046 MOVEI CHR,"↓"
047 026 012 JSP TAC,DLNOCH ; send an abort
048 016 032 PUSHJ P,DLWAIT
049 DLNDDB 002 047 MOVE CHR,DREP(DDB) ; get reply
050 CAIE CHR,"B"
051 JRST [ JSP TAC,UUOMES
052 ASCIZ/Dialer failure, UUO/]
053 XCTR XR,[DMOVE AC2,4(UUO)]
054 DLNDDB 002 046 DMOVEM AC2,DNUM(DDB)
055 XCTR XR,[DMOVE AC2,6(UUO)]
056 DLNDDB 002 046 DMOVEM AC2,DNUM+2(DDB)
057 026 028 PUSHJ P,DLNDIL ; start dialing
058 016 032 PUSHJ P,DLWAIT ; wait for dialing to be done
059 DLNDDB 002 047 MOVE CHR,DREP(DDB) ; get reply code
060 CAIE CHR,"A" ; did dialing win?
061 JRST [ MOVEM CHR,(UUO) ; you lost
062 POPJ P,]
063 ; JRST SNDNOP
␈↓& UUO routines DLNSER[S,SYS] 08/14/78 Page 13␈↓'α
001 ;SNDNOP DLNRPA DLNRWN
002
003 ; Send a couple of NOPs, to allow for normal line flakiness
004
005 005 025 SNDNOP: PUSHJ P,MAKPDB ; get an empty PDB (which happens to be a NOP)
006 030 010 PUSHJ P,DLNBUG
007 017 026 PUSHJ P,DLOUTQ
008 005 025 PUSHJ P,MAKPDB
009 030 010 PUSHJ P,DLNBUG
010 017 026 PUSHJ P,DLOUTQ
011
012 ; Now send the RPC
013
014 DLNRPA: AOS (P) ; set skip return
015 DLNDDB 002 042 SKIPG DOWIN(DDB) ; window still open?
016 016 007 PUSHJ P,DXHANG
017 005 025 PUSHJ P,MAKPDB
018 030 010 PUSHJ P,DLNBUG
019 004 016 MOVEI TAC,%RPC ; RPC type packet
020 004 061 DPB TAC,PKTOPC
021 MOVEI TAC,=10
022 004 064 DPB TAC,PKTSIZ
023 XCTR XR,[DMOVE AC2,1(UUO)] ; get PID
024 SKIPN AC2
025 004 035 JUMPE AC3,[ MOVEI TAC,DS%CON
026 DLNDDB 002 030 IORM TAC,DSTAT(DDB) ; mark connection open for accept RPC
027 013 029 JRST DLNRWN]
028 DLNDDB 002 033 DMOVEM AC2,DPID(DDB) ; otherwise set PID for pending RPC
029 004 047 DLNRWN: DMOVEM AC2,PDBDAT(PDB) ; in any case, set PID in the packet
030 XCTR XR,[MOVE TAC,3(UUO)] ; window size
031 004 029 CAIL TAC,WINMIN
032 004 031 CAILE TAC,WINMAX
033 004 030 MOVEI TAC,WINDEF ; user specified ridiculous argument
034 004 070 DPB TAC,PKTWNS
035 DLNDDB 002 034 EXCH TAC,DIWS(DDB) ; DIWS ← new window size
036 DLNDDB 002 034 SUB TAC,DIWS(DDB) ; TAC ← - # of PDB's added
037 MOVNS TAC ; TAC ← # of PDB's added
038 DLNDDB 002 041 ADDM TAC,DIWIN(DDB)
039 017 026 JRST DLOUTQ
␈↓& UUO routines DLNSER[S,SYS] 08/14/78 Page 14␈↓'α
001 ;DLNCLS DLNWIN DLNEOF
002
003 ; Send CLS (close process connection)
004 ; CLOSE chn,
005 ; or
006 ; MTAPE chn,block
007 ; ...
008 ; block:1
009
010 004 035 DLNCLS: MOVEI TAC,DS%CON
011 DLNDDB 002 030 TDNN TAC,DSTAT(DDB) ; if there is no connection
012 POPJ P, ; it's a no-op
013 010 055 PUSHJ P,DLOOUT ; flush user output
014 DLNDDB 002 042 SKIPG DOWIN(DDB) ; window still open?
015 016 007 PUSHJ P,DXHANG
016 005 025 PUSHJ P,MAKPDB ; get a PDB
017 030 010 PUSHJ P,DLNBUG ; no core at UUO level?
018 004 017 MOVEI TAC,%CLS ; CLS type packet
019 004 061 DPB TAC,PKTOPC
020 004 035 MOVEI TAC,DS%CON
021 DLNDDB 002 030 ANDCAM TAC,DSTAT(DDB) ; mark connection as closed (reply clears PID)
022 017 026 PUSHJ P,DLOUTQ
023 DLNDDB 002 033 SKIPE DPID(DDB)
024 016 007 PUSHJ P,DXHANG
025 DLNDDB 002 033 SKIPE DPID+1(DDB)
026 016 007 PUSHJ P,DXHANG
027 POPJ P,
028
029 ; Send WIN (set window size)
030 ; MTAPE chn,block
031 ; ...
032 ; block:2
033 ; window size
034
035 DLNDDB 002 042 DLNWIN: SKIPG DOWIN(DDB) ; window still open?
036 016 007 PUSHJ P,DXHANG
037 005 025 PUSHJ P,MAKPDB
038 030 010 PUSHJ P,DLNBUG
039 004 018 MOVEI TAC,%WIN ; WIN type packet
040 004 061 DPB TAC,PKTOPC
041 XCTR XR,[MOVE TAC,2(UUO)] ; window size
042 004 029 CAIL TAC,WINMIN
043 004 031 CAILE TAC,WINMAX
044 004 030 MOVEI TAC,WINDEF ; user specified ridiculous argument
045 004 067 DPB TAC,PKTFDA
046 DLNDDB 002 034 EXCH TAC,DIWS(DDB) ; DIWS ← new window size
047 DLNDDB 002 034 SUB TAC,DIWS(DDB) ; TAC ← - # of PDB's added
048 017 026 JRST DLOUTQ
049
050 ; Send EOF (end of file)
051 ; MTAPE chn,block
052 ; ...
053 ; block:3
054 ; Dialnet channel
055
056 DLNEOF: XCTR XR,[SKIPL DAT,1(UUO)] ; channel
057 CAILE DAT,17 ; channel #'s are a 4 bit field
058 017 021 JRST DCHLUZ
059 004 035 MOVEI TAC,DS%CON
060 DLNDDB 002 030 TDNN TAC,DSTAT(DDB)
061 017 016 JRST NORPC
062 010 055 PUSHJ P,DLOOUT ; flush output
063 DLNDDB 002 042 SKIPG DOWIN(DDB) ; window still open?
064 016 007 PUSHJ P,DXHANG
065 005 025 PUSHJ P,MAKPDB ; create a new PDB
066 030 010 PUSHJ P,DLNBUG
067 004 060 DPB DAT,PKTCHN
068 004 021 MOVEI TAC,%EOF ; end of file
069 004 061 DPB TAC,PKTOPC
070 017 026 JRST DLOUTQ
␈↓& UUO routines DLNSER[S,SYS] 08/14/78 Page 15␈↓'α
001 ;DLNINT DLNSTA DLNCWA
002
003 ; Send INT (interrupt)
004 ; MTAPE chn,block
005 ; ...
006 ; block:4
007 ; Dialnet channel
008
009 DLNINT: XCTR XR,[SKIPL DAT,1(UUO)] ; channel
010 CAILE DAT,17 ; 0≤channel≤17
011 017 021 JRST DCHLUZ
012 004 035 MOVEI TAC,DS%CON
013 DLNDDB 002 030 TDNN TAC,DSTAT(DDB)
014 017 016 JRST NORPC
015 DLNDDB 002 042 SKIPG DOWIN(DDB) ; window still open?
016 016 007 PUSHJ P,DXHANG
017 005 025 PUSHJ P,MAKPDB
018 030 010 PUSHJ P,DLNBUG
019 004 060 DPB DAT,PKTCHN
020 004 022 MOVEI TAC,%INT ; interrupt
021 004 061 DPB TAC,PKTOPC
022 017 026 JRST DLOUTQ
023
024 ; Get Dialnet status
025 ; MTAPE chn,block
026 ; ...
027 ; block:6
028 ; status bits returned here
029 ; first 4 bytes of PID
030 ; second 4 bytes of PID
031 ; input window size
032 ; output window size
033 ; four words of ASCIZ phone number
034
035 DLNDDB 002 030 DLNSTA: MOVE TAC,DSTAT(DDB) ; get status bits
036 XCTR XW,[MOVEM TAC,1(UUO)]
037 DLNDDB 002 033 DMOVE TAC,DPID(DDB) ; process ID
038 XCTR XW,[DMOVEM TAC,2(UUO)]
039 DLNDDB 002 034 DMOVE TAC,DIWS(DDB) ; window sizes
040 XCTR XW,[DMOVEM TAC,4(UUO)]
041 DLNDDB 002 046 DMOVE TAC,DNUM(DDB) ; phone number
042 XCTR XW,[DMOVEM TAC,6(UUO)]
043 DLNDDB 002 046 DMOVE TAC,DNUM+2(DDB)
044 XCTR XW,[DMOVEM TAC,10(UUO)]
045 POPJ P,
046
047 ; Wait for connection to open
048 ; MTAPE chn,block
049 ; <connection refused>
050 ; <connection open>
051 ; ..
052 ; block:7
053
054 004 035 DLNCWA: MOVEI TAC,DS%CON
055 DLNDDB 002 030 TDNE TAC,DSTAT(DDB) ; connection open yet?
056 JRST CPOPJ1
057 DLNDDB 002 033 MOVE TAC,DPID(DDB) ; or maybe refused?
058 DLNDDB 002 033 SKIPN DPID+1(DDB) ; you lose buckeroo
059 JUMPE TAC,CPOPJ
060 016 032 PUSHJ P,DLWAIT
061 015 054 JRST DLNCWA
␈↓& Random UUO subroutines DLNSER[S,SYS] 08/14/78 Page 16␈↓'α
001 ;DXHANG DLHANG DCWAIT DLWAIT DCWAKE DLWAKE
002
003 SUBTTL Random UUO subroutines
004
005 ; Similar to DXHANG, but don't check wait bit, etc.
006
007 DXHANG: SOS (P) ; point stack at previous instruction
008 SOS (P)
009 016 032 JRST DLWAIT ; go into IOWQ
010
011 ; Here for I/O UUO's to hang until the previous instruction skips.
012
013 DLHANG: XCTR XW,[MOVEM AC3,(UUO)] ; return updated args to user
014 XCTR XW,[MOVEM AC2,1(UUO)]
015 004 035 MOVEI TAC,DS%CON
016 DLNDDB 002 030 TDNE TAC,DSTAT(DDB)
017 TLNE AC3,40
018 JRST [ADJSP P,-1 ↔ POPJ P,]
019 SOS (P) ; point stack at previous instruction
020 SOS (P)
021 016 032 JRST DLWAIT ; go into IOWQ
022
023 ; Here to enter IOWQ. DCWAIT is used to sleep for 5 seconds. Preserves
024 ; PDB, AC2, AC3, & DDB.
025
026 DCWAIT: LDB TAC,PUNIT ; clock level has to find the DDB
027 LSH TAC,=12
028 016 045 IOR TAC,[DCWAKE,,5*JIFSEC] ; wait five seconds
029 CONO PI,PIOFF
030 IDPB TAC,CLOCK(PID)
031 CONO PI,PION
032 DLWAIT: MOVSI IOS,DEVSBB ; DLN is internally buffered
033 IORB IOS,DEVIOS(DDB)
034 004 047 PUSH P,PDB ; preserve PDB and possible pointer AC's
035 PUSH P,AC2
036 PUSH P,AC3
037 PUSHJ P,WSYNC ; wait until I-level says can go
038 POP P,AC3 ; restore our AC's
039 POP P,AC2
040 004 047 POP P,PDB
041 POPJ P,
042
043 ; Here to wake up a process in IOWQ. DCWAKE is the clock queue entry point.
044
045 DCWAKE: LDB TAC,[140600,,DAT] ; here from clock-level, get unit #
046 DLNDDB 002 057 MOVE DDB,DLNUTB(TAC) ; and DDB thereof
047 DLWAKE: MOVE IOS,DEVIOS(DDB)
048 TLZ IOS,DEVSBB ; system buffer no longer busy
049 TLZE IOS,IOW ; was job in I/O wait?
050 PUSHJ P,STTIOD ; put job into TQ
051 MOVEM IOS,DEVIOS(DDB)
052 POPJ P,
␈↓& Random UUO subroutines DLNSER[S,SYS] 08/14/78 Page 17␈↓'α
001 ;GETARG NORPC DCHLUZ DLOUTQ DLOUQ1
002
003 ; Get I/O UUO args. AC3 ← byte pointer, AC2 ← byte count. Also checks for
004 ; writeability.
005
006 GETARG: XCTR XRW,[MOVES AC2,1(UUO)] ; AC2 ← byte count
007 XCTR XRW,[MOVES AC3,(UUO)] ; AC3 ← user's byte pointer
008 TLNN AC3,7700 ; did user specify a size?
009 TLZA AC3,777737 ; nope, flush whatever was there
010 TLZA AC3,37 ; flush index and indirect
011 TLO AC3,441100 ; force 9-bit byte pointer
012 POPJ P,
013
014 ; Here when trying to do I/O without a Dialnet connection
015
016 NORPC: JSP TAC,UUOMES
017 ASCIZ\Dialnet I/O without RPC, UUO\
018
019 ; Here when data channel <0 or >17
020
021 DCHLUZ: JSP TAC,UUOMES
022 ASCIZ/Illegal Dialnet channel number, UUO/
023
024 ; Here to queue a PDB for output
025
026 004 061 DLOUTQ: LDB TAC,PKTOPC ; check opcode
027 017 033 JUMPE TAC,DLOUQ1 ; knows that %NOP=0
028 004 023 CAIE TAC,%ERR
029 004 020 CAIN TAC,%NAK
030 017 033 JRST DLOUQ1 ; these don't count against the window
031 DLNDDB 002 042 SOSGE DOWIN(DDB) ; decrement window
032 030 010 PUSHJ P,DLNBUG ; some loser didn't check!
033 DLNDDB 002 039 DLOUQ1: MOVEI TAC,DOLIST(DDB) ; start at the beginning
034 CONO PI,SCNOFF
035 HRRZ TAC1,(TAC) ; run down the list until at end
036 JUMPN TAC1,[MOVEI TAC,(TAC1) ↔ JRST .-1]
037 DLNDDB 002 039 SKIPE DOLIST(DDB) ; unless there is no list
038 004 047 HRLZM TAC,(PDB) ; bind list to new
039 004 047 HRRM PDB,(TAC) ; bind new to list
040 CONO PI,SCNON
041 004 037 MOVEI TAC,DS%IDL
042 DLNDDB 002 030 TDNN TAC,DSTAT(DDB) ; output I-level idle?
043 POPJ P, ; no, it'll get to it naturally
044 024 009 JRST WRLSTX ; start up output I-level
␈↓& Crock-level DLNSER[S,SYS] 08/14/78 Page 18␈↓'α
001 ;DLNCLK DLNCL1 DLNCL2
002
003 SUBTTL Crock-level
004
005 ; This creature is called every 5 seconds to paw over all the
006 ; Dialnet ports and put no-ops on any one that looks idle. This
007 ; is to prevent lossage due to dropped acknowledges which might
008 ; otherwise cause deadly embraces (hug hug).
009
010 DLNCLK: MOVE TAC,[DLNCLK,,5*JIFSEC] ; requeue the request
011 CONO PI,PIOFF
012 IDPB TAC,CLOCK(PID)
013 CONO PI,PION
014 MOVSI TAC,-DLNNUM
015 DLNDDB 002 057 DLNCL1: MOVE DDB,DLNUTB(TAC) ; get DDB for this unit
016 PUSH P,TAC
017 DLNDDB 002 030 MOVE TAC,DSTAT(DDB)
018 004 037 TRNE TAC,DS%IDL ; line should be idle
019 004 040 TRNN TAC,DS%CCR ; and there should be carrier
020 018 038 JRST DLNCL2 ; otherwise don't consider this port
021 DLNDDB 002 039 SKIPE DOLIST(DDB) ; output list had better be empty
022 030 010 PUSHJ P,DLNBUG
023 CONO PI,SCNOFF
024 DLNDDB 002 040 SKIPN PDB,DXLIST(DDB) ; see if want to resend the top of the pending queue
025 JRST [ CONO PI,SCNON
026 005 025 PUSHJ P,MAKPDB ; create a no-op
027 018 038 JRST DLNCL2
028 017 026 PUSHJ P,DLOUTQ ; queue it for output
029 018 038 JRST DLNCL2]
030 004 047 HRRZ TAC,PDBLNK(PDB) ; get its next
031 004 047 SETZM PDBLNK(PDB) ; unlink it from the next
032 SKIPE TAC
033 004 049 HRRZS PDBLNK(TAC) ; unlink this one from the next
034 DLNDDB 002 040 MOVEM TAC,DXLIST(DDB) ; and remove this from the queue
035 DLNDDB 002 039 MOVEM PDB,DOLIST(DDB)
036 CONO PI,SCNON
037 024 009 PUSHJ P,WRLSTX
038 DLNCL2: POP P,TAC
039 018 015 AOBJN TAC,DLNCL1 ; loop through for each DDB
040 POPJ P,
␈↓& Input I-level loop DLNSER[S,SYS] 08/14/78 Page 19␈↓'α
001 ;RDPCKT RDPCKX RDPDAT
002
003 SUBTTL Input I-level loop
004
005 ; Stuff a PDB with an incoming packet, do framing, checksum, and sequence
006 ; verification. Entered when an SOP happens.
007
008 DLNDDB 002 037 RDPCKT: SKIPE PDB,INTPDB(DDB) ; is there a PDB from before?
009 019 013 JRST RDPCKX
010 005 025 PUSHJ P,MAKPDB ; get a new PDB
011 POPJ P,
012 DLNDDB 002 037 MOVEM PDB,INTPDB(DDB)
013 RDPCKX: MOVEI TAC,1 ; initialize checksum
014 004 047 MOVEM TAC,PDBCHK(PDB)
015 026 007 JSP TAC,DLNICH ; word 1 - packet channel/op code
016 026 063 PUSHJ P,CHKBYT
017 004 059 DPB CHR,PKTCOP
018 026 007 JSP TAC,DLNICH ; word 2 - packet sequence number
019 026 063 PUSHJ P,CHKBYT
020 004 062 DPB CHR,PKTSEQ
021 026 007 JSP TAC,DLNICH ; word 3 - packet acknowledgement
022 026 063 PUSHJ P,CHKBYT
023 004 063 DPB CHR,PKTACK
024 026 007 JSP TAC,DLNICH ; word 4 - packet size
025 026 063 PUSHJ P,CHKBYT
026 004 064 DPB CHR,PKTSIZ
027 004 047 MOVEM CHR,PDBCNT(PDB) ; packet data area byte count
028 004 066 MOVE TAC,PKTDAT ; byte pointer
029 004 047 MOVEM TAC,PDBPNT(PDB)
030 026 007 RDPDAT: JSP TAC,DLNICH ; data byte
031 026 063 PUSHJ P,CHKBYT
032 004 047 IDPB CHR,PDBPNT(PDB)
033 004 047 SOSL PDBCNT(PDB) ; continue until read all data
034 019 030 JRST RDPDAT
035 MOVEI TAC,600000 ; stray bits in checksum
036 004 047 ANDCAM TAC,PDBCHK(PDB) ; get flushed here
037 026 007 JSP TAC,DLNICH ; packet checksum
038 004 047 XORM CHR,PDBCHK(PDB)
039 026 007 JSP TAC,DLNICH
040 LSH CHR,=8 ; high order 8 bits of checksum
041 004 047 XORB CHR,PDBCHK(PDB)
042 004 039 MOVEI TAC,DS%EOP
043 SKIPN CHR ; if not checksum error
044 DLNDDB 002 030 IORM TAC,DSTAT(DDB) ; tell RDPDUN it has permission to run
045 026 007 JSP TAC,DLNICH ; end of coroutine
046 MOVEI TAC,CPOPJ ; mark input idle
047 DLNDDB 002 031 MOVEM TAC,DIDS(DDB)
048 DLNDDB 002 037 SETZM INTPDB(DDB)
049 006 009 JRST CLRPDB ; return means framing error
␈↓& Input I-level loop DLNSER[S,SYS] 08/14/78 Page 20␈↓'α
001 ;RDPDUN RDPSIW RDPFAK RDPCKN RDPNRT
002
003 ; Here when an EOP received
004
005 DLNDDB 002 027 RDPDUN: AOS NINPKT(DDB) ; count up one more winner
006 DLNDDB 002 041 SOSL DIWIN(DDB) ; any space in window?
007 020 009 JRST RDPSIW
008 003 010 DLNMSG(<Window overrun>)
009 RDPSIW: MOVEI TAC,CPOPJ ; mark input idle
010 DLNDDB 002 031 MOVEM TAC,DIDS(DDB)
011 DLNDDB 002 037 SETZM INTPDB(DDB) ; remove this PDB from input I-level
012 004 047 PUSH P,PDB
013 004 063 LDB TAC1,PKTACK ; packet remote guy is acknowledging
014 020 030 JUMPE TAC1,RDPCKN ; explicit no-acknowledge
015 DLNDDB 002 040 SKIPN PDB,DXLIST(DDB) ; check acknowledgement list
016 020 030 JRST RDPCKN
017 004 062 RDPFAK: LDB TAC,PKTSEQ
018 CAIE TAC,(TAC1) ; found the one being acknowledged?
019 004 047 JRST [ HRRZ PDB,PDBLNK(PDB) ; nope, try next on the list
020 020 017 JUMPN PDB,RDPFAK
021 020 030 JRST RDPCKN]
022 004 047 HLRZ TAC,PDBLNK(PDB) ; TAC ← previous
023 SKIPN TAC
024 DLNDDB 002 040 MOVEI TAC,DXLIST(DDB) ; if no previous, flush the list
025 004 049 HLLZS PDBLNK(TAC)
026 004 047 HRRZS PDBLNK(PDB) ; complete the amputation
027 006 009 PUSHJ P,CLRPDB ; now delete all of these packets
028 DLNDDB 002 042 AOS DOWIN(DDB)
029 004 047 JUMPN PDB,.-2
030 004 047 RDPCKN: POP P,PDB
031 004 062 LDB TAC,PKTSEQ ; get seq # of this packet
032 021 018 JUMPE TAC,RDPPK0 ; packet 0 always wins
033 DLNDDB 002 043 MOVE TAC1,DACK(DDB) ; get expected packet
034 ADDI TAC1,1
035 TRZE TAC1,400 ; overflow case
036 MOVEI TAC1,1
037 CAIN TAC,(TAC1) ; was this the packet we expected?
038 021 005 JRST RDPPAK
039 SUBI TAC,(TAC1) ; sexy modulo 2↑8 comparison (thank you, Dave Moon)
040 TRNE TAC,200 ; sorry luv, I have a headache
041 021 031 JRST RDPNOP ; unnecessary retransmission
042 004 047 PUSH P,PDB
043 DLNDDB 002 042 SKIPLE DOWIN(DDB) ; make sure the window is open
044 005 025 PUSHJ P,MAKPDB ; get a PDB to frob
045 020 049 JRST RDPNRT
046 004 020 MOVEI TAC,%NAK ; NAK type packet
047 004 061 DPB TAC,PKTOPC
048 017 026 PUSHJ P,DLOUTQ ; make PDB available for output
049 004 047 RDPNRT: POP P,PDB
050 021 031 JRST RDPNOP
␈↓& Input I-level loop DLNSER[S,SYS] 08/14/78 Page 21␈↓'α
001 ;RDPPAK RDPNPK RDPPK0 RDPNOP INTTAB
002
003 ; Positive acknowledge
004
005 DLNDDB 002 043 RDPPAK: MOVEM TAC,DACK(DDB) ; remember to acknowledge this one
006 004 041 MOVEI TAC,DS%ACN
007 DLNDDB 002 030 IORM TAC,DSTAT(DDB) ; note that an acknowledgement is needed
008 004 047 PUSH P,PDB
009 004 037 MOVEI TAC,DS%IDL
010 DLNDDB 002 030 TDNE TAC,DSTAT(DDB) ; if output is idle, acknowledge it manually
011 005 025 PUSHJ P,MAKPDB ; get an empty PDB (which happens to be a NOP)
012 021 017 JRST RDPNPK ; not idle or no core
013 DLNDDB 002 039 SKIPE DOLIST(DDB)
014 030 010 PUSHJ P,DLNBUG ; not really idle?
015 DLNDDB 002 039 MOVEM PDB,DOLIST(DDB) ; create a "list"
016 024 009 PUSHJ P,WRLSTX ; acknowledge the packet
017 004 047 RDPNPK: POP P,PDB
018 004 066 RDPPK0: MOVE TAC,PKTDAT ; set up pointer
019 004 047 MOVEM TAC,PDBPNT(PDB)
020 004 064 LDB TAC,PKTSIZ ; and counter
021 AOS TAC
022 004 047 MOVEM TAC,PDBCNT(PDB)
023 004 040 MOVEI TAC,DS%CCR ; find out about carrier detect
024 DLNDDB 002 030 IORM TAC,DSTAT(DDB)
025 004 061 LDB TAC,PKTOPC
026 008 049 CAIGE TAC,OPMAX ; legal opcode?
027 021 037 JRST @INTTAB(TAC) ; yes, dispatch to appropriate server
028 003 010 DLNMSG(<Illegal opcode>,TAC)
029 027 008 PUSHJ P,SNDERR
030 ASCIZ/Illegal opcode/
031 DLNDDB 002 041 RDPNOP: AOS DIWIN(DDB) ; open up the window
032 006 009 PUSHJ P,CLRPDB
033 016 047 JRST DLWAKE
034
035 ; I-level opcode dispatch table
036
037 021 031 INTTAB: RDPNOP ; %NOP
038 023 005 RDPRPC ; %RPC
039 023 038 RDPCLS ; %CLS
040 022 021 RDPWIN ; %WIN
041 022 005 RDPMSG ; %MSG
042 022 048 RDPNAK ; %NAK
043 022 005 RDPMSG ; %EOF
044 022 037 RDPINT ; %INT
045 022 070 RDPERR ; %ERR
046
047 021 037 IFN OPMAX-<.-INTTAB>,<.FATAL INTTAB loses>
␈↓& Input I-level loop DLNSER[S,SYS] 08/14/78 Page 22␈↓'α
001 ;RDPMSG RDPWIN RDPWN1 RDPINT RDPNAK REVPDB RDPERR
002
003 ; Incoming message
004
005 004 035 RDPMSG: MOVEI TAC,DS%CON ; must be connected
006 DLNDDB 002 030 TDNN TAC,DSTAT(DDB)
007 003 010 JRST [ DLNMSG(<No connection>)
008 027 008 PUSHJ P,SNDERR
009 ASCIZ/MSG, EOF, or INT with no connection/
010 021 031 JRST RDPNOP]
011 DLNDDB 002 038 MOVEI TAC,DILIST(DDB)
012 004 049 HRRZ TAC1,PDBLNK(TAC) ; run down list
013 JUMPN TAC1,[MOVEI TAC,(TAC1) ↔ JRST .-1]
014 004 049 HRRZM PDB,PDBLNK(TAC) ; link message at end of list
015 DLNDDB 002 038 CAIE TAC,DILIST(DDB) ; never link the DDB in!
016 004 047 HRLZM TAC,PDBLNK(PDB)
017 016 047 JRST DLWAKE
018
019 ; Set window size
020
021 004 067 RDPWIN: LDB TAC,PKTFDA ; get desired window
022 004 029 RDPWN1: CAIL TAC,WINMIN ; check for within bounds (here from RPC code)
023 004 031 CAILE TAC,WINMAX
024 003 010 JRST [DLNMSG(<Bad window size>,TAC)
025 027 008 PUSHJ P,SNDERR
026 ASCIZ/Illegal window size, using system default/
027 MOVEI TAC,WINDEF; default
028 JRST .+1]
029 DLNDDB 002 035 EXCH TAC,DOWS(DDB) ; set the window
030 DLNDDB 002 035 SUB TAC,DOWS(DDB)
031 MOVNS TAC
032 DLNDDB 002 042 ADDM TAC,DOWIN(DDB)
033 021 031 JRST RDPNOP
034
035 ; Interrupt
036
037 RDPINT: LDB J,PJOBN ; get owner's job #
038 022 005 JUMPE J,RDPMSG ; no owner
039 MOVSI TAC,INTINS
040 TDNN TAC,JBTIEN(J) ; job take this int?
041 022 005 JRST RDPMSG
042 IORM TAC,JBTIRQ(J) ; yes, give job the int
043 SETOM INTREQ
044 022 005 JRST RDPMSG
045
046 ; Here when a request comes in to requeue the list (ie, a NAK)
047
048 DLNDDB 002 041 RDPNAK: AOS DIWIN(DDB)
049 006 009 PUSHJ P,CLRPDB
050 DLNDDB 002 040 SKIPN PDB,DXLIST(DDB) ; get unacknowledged list
051 016 047 JRST DLWAKE
052 004 047 REVPDB: MOVSS TAC,PDBLNK(PDB) ; reverse the list (thank you, Guy Steele!)
053 004 047 HLRZ PDB,PDBLNK(PDB) ; PDB←previous(PDB), TAC←next(PDB)
054 022 052 JUMPN PDB,REVPDB
055 SKIPN TAC ; just take a look at this nifty hack!!!
056 DLNDDB 002 040 SKIPA PDB,DXLIST(DDB) ; if next(PDB)=0 then PDB←list
057 004 049 HLRZ PDB,PDBLNK(TAC) ; else PDB←previous(next(PDB))
058 DLNDDB 002 040 MOVE TAC1,DXLIST(DDB) ; remember where it ends
059 DLNDDB 002 040 SETZM DXLIST(DDB) ; remove all traces of pending list
060 DLNDDB 002 039 SKIPN TAC,DOLIST(DDB) ; is there a list in progress?
061 DLNDDB 002 039 JRST [ MOVEM PDB,DOLIST(DDB)
062 024 009 PUSHJ P,WRLSTX ; start up output
063 016 047 JRST DLWAKE]
064 004 049 HRLM TAC1,PDBLNK(TAC) ; link requeue list at front of output list
065 004 049 HRRM TAC,PDBLNK(TAC1) ; and output list at end of requeue list
066 016 047 JRST DLWAKE
067
068 ; Error
069
070 004 066 RDPERR: DLNMSG(<Error received>,,PKTDAT)
071 021 031 JRST RDPNOP
␈↓& Input I-level loop DLNSER[S,SYS] 08/14/78 Page 23␈↓'α
001 ;RDPRPC RDRPC2 RDPCLS RDPCL1
002
003 ; Open connection
004
005 004 035 RDPRPC: MOVEI TAC,DS%CON
006 DLNDDB 002 030 TDNE TAC,DSTAT(DDB) ; is there a connection?
007 003 010 JRST [ DLNMSG(<Spurious RPC>)
008 027 008 PUSHJ P,SNDERR
009 ASCIZ/RPC when a connection exists/
010 021 031 JRST RDPNOP]
011 004 047 DMOVE AC2,PDBDAT(PDB) ; AC2/AC3 ← PID
012 DLNDDB 002 033 SKIPN DPID(DDB) ; is there a PID already?
013 DLNDDB 002 033 SKIPE DPID+1(DDB)
014 004 035 JRST [MOVEI TAC,DS%CON
015 DLNDDB 002 030 IORM TAC,DSTAT(DDB) ; mark connection open
016 SKIPN AC2 ; if so, PID must be zero
017 023 031 JUMPE AC3,RDRPC2
018 DLNDDB 002 030 ANDCAM TAC,DSTAT(DDB) ; mark connection closed
019 DLNDDB 002 033 SETZM DPID(DDB) ; flush PIDs
020 DLNDDB 002 033 SETZM DPID+1(DDB)
021 003 010 DLNMSG(<Non-null PID in accept RPC>)
022 027 008 PUSHJ P,SNDERR
023 ASCIZ/Non-null PID in accept RPC/
024 021 031 JRST RDPNOP]
025 SKIPN AC2 ; otherwise, PID must be non-zero
026 003 010 JUMPE AC3,[ DLNMSG(<Null PID in connect RPC>)
027 027 008 PUSHJ P,SNDERR
028 ASCIZ/Null PID in connect RPC/
029 021 031 JRST RDPNOP]
030 DLNDDB 002 033 DMOVEM AC2,DPID(DDB)
031 026 047 RDRPC2: PUSHJ P,DLNLGR ; run the logger
032 004 070 LDB TAC,PKTWNS
033 021 031 JUMPE TAC,RDPNOP ; forget it if none
034 022 022 JRST RDPWN1
035
036 ; Close connection
037
038 RDPCLS: LDB J,PJOBN
039 023 047 JUMPE J,RDPCL1
040 MOVEI IOS,IODERR ; note close coming
041 IORB IOS,DEVIOS(DDB)
042 MOVSI TAC,INTIMS ; status change
043 TDNN TAC,JBTIEN(J)
044 023 047 JRST RDPCL1
045 IORM TAC,JBTIRQ(J)
046 SETOM INTREQ
047 004 035 RDPCL1: MOVEI TAC,DS%CON
048 DLNDDB 002 030 TDNE TAC,DSTAT(DDB) ; is connection closing?
049 022 005 JRST RDPMSG ; yes, put it into input list
050 DLNDDB 002 033 SETZM DPID(DDB) ; clear PID no matter what
051 DLNDDB 002 033 SETZM DPID+1(DDB)
052 006 009 JUMPN J,CLRPDB
053 006 009 PUSHJ P,CLRPDB ; otherwise forget it
054 007 028 JRST DLNRLS ; and do release cruft
␈↓& Output I-level loop DLNSER[S,SYS] 08/14/78 Page 24␈↓'α
001 ;WRLIST WRLSTX WRPSOP
002
003 SUBTTL Output I-level loop
004
005 ; Outputs packets from the list.
006
007 DLNDDB 002 039 WRLIST: SKIPN PDB,DOLIST(DDB) ; get packet to do now
008 POPJ P,
009 004 037 WRLSTX: MOVEI TAC,DS%IDL
010 DLNDDB 002 030 TDNN TAC,DSTAT(DDB) ; better have been "idle" at this point
011 030 010 PUSHJ P,DLNBUG
012 DLNDDB 002 030 ANDCAM TAC,DSTAT(DDB) ; output I-level active again
013 004 062 LDB TAC,PKTSEQ ; if it already has a sequence number (as in
014 024 025 JUMPN TAC,WRPSOP ; requeueing), don't generate another!
015 004 061 LDB TAC,PKTOPC ; check opcode
016 024 025 JUMPE TAC,WRPSOP ; knows that %NOP=0
017 004 023 CAIE TAC,%ERR
018 004 020 CAIN TAC,%NAK
019 024 025 JRST WRPSOP ; error and no-op packets don't get numbers
020 DLNDDB 002 044 AOS CHR,DSEQ(DDB) ; word 3 -- packet sequence number
021 TRZE CHR,400
022 MOVEI CHR,1 ; cycle back to 1 on overflow
023 004 062 DPB CHR,PKTSEQ
024 DLNDDB 002 044 MOVEM CHR,DSEQ(DDB) ; in case of wraparound
025 WRPSOP: MOVEI TAC,1 ; init checksum
026 004 047 MOVEM TAC,PDBCHK(PDB)
027 004 007 MOVEI CHR,%DLE ; all packets start with SOP
028 026 015 JSP TAC,DLNOC1 ; DLNOC1 skips DLE check
029 004 011 MOVEI CHR,%STX
030 026 012 JSP TAC,DLNOCH
031 004 059 LDB CHR,PKTCOP ; word 1 -- packet channel/op code
032 026 063 PUSHJ P,CHKBYT
033 026 012 JSP TAC,DLNOCH
034 004 062 LDB CHR,PKTSEQ ; word 2 -- packet number
035 026 063 PUSHJ P,CHKBYT
036 026 012 JSP TAC,DLNOCH
037 DLNDDB 002 043 MOVE CHR,DACK(DDB) ; word 3 -- packet acknowledgement
038 004 063 DPB CHR,PKTACK
039 026 063 PUSHJ P,CHKBYT
040 004 041 MOVEI TAC,DS%ACN ; note that we've acknowledged one
041 DLNDDB 002 030 ANDCAM TAC,DSTAT(DDB)
042 026 012 JSP TAC,DLNOCH
043 004 064 LDB CHR,PKTSIZ ; word 4 -- packet size -1
044 026 063 PUSHJ P,CHKBYT
045 004 047 MOVEM CHR,PDBCNT(PDB)
046 026 012 JSP TAC,DLNOCH
047 004 066 MOVE TAC,PKTDAT ; data area pointer
048 004 047 MOVEM TAC,PDBPNT(PDB)
049 ; JRST WRPDAT
␈↓& Output I-level loop DLNSER[S,SYS] 08/14/78 Page 25␈↓'α
001 ;WRPDAT WRPMOR WRPBKU
002
003 004 047 WRPDAT: ILDB CHR,PDBPNT(PDB)
004 026 063 PUSHJ P,CHKBYT
005 026 012 JSP TAC,DLNOCH
006 004 047 SOSL PDBCNT(PDB) ; data done?
007 025 003 JRST WRPDAT
008 004 047 LDB CHR,[001000,,PDBCHK(PDB)] ; LSB of checksum
009 026 012 JSP TAC,DLNOCH
010 004 047 LDB CHR,[101000,,PDBCHK(PDB)] ; MSB of checksum
011 026 012 JSP TAC,DLNOCH
012 004 007 MOVEI CHR,%DLE ; all packets end with EOP
013 026 015 JSP TAC,DLNOC1 ; DLNOC1 skips DLE check
014 004 009 MOVEI CHR,%ETX
015 026 012 JSP TAC,DLNOCH
016 DLNDDB 002 028 AOS NOUPKT(DDB)
017 024 007 MOVEI TAC,WRLIST
018 DLNDDB 002 032 MOVEM TAC,DODS(DDB)
019 004 037 MOVEI TAC,DS%IDL
020 DLNDDB 002 030 IORM TAC,DSTAT(DDB) ; note output I-level idle
021 004 047 HLRZ TAC,PDBLNK(PDB) ; get previous
022 025 049 JUMPN TAC,WRPBKU ; oops! retransmission time!!!
023 004 047 SKIPE TAC,PDBLNK(PDB)
024 004 049 HRRZS PDBLNK(TAC) ; unbind the PDB just output from this one
025 DLNDDB 002 039 MOVEM TAC,DOLIST(DDB) ; make it the current
026 025 035 JUMPN TAC,WRPMOR ; skip the extra acknowledgement cruft if more
027 004 041 MOVEI TAC,DS%ACN
028 DLNDDB 002 030 TDNN TAC,DSTAT(DDB) ; if an acknowledgement is needed
029 025 035 JRST WRPMOR
030 004 047 PUSH P,PDB
031 005 025 PUSHJ P,MAKPDB ; get an empty PDB (which happens to be a NOP)
032 TRNA
033 DLNDDB 002 039 MOVEM PDB,DOLIST(DDB) ; queue it, which will send an acking NOP!
034 004 047 POP P,PDB
035 004 062 WRPMOR: LDB TAC,PKTSEQ
036 JUMPE TAC,[ PUSHJ P,DLWAKE ; wake up user
037 PUSHJ P,CLRPDB ; if not to be acknowledged, delete it
038 024 007 JRST WRLIST]
039 DLNDDB 002 040 MOVE TAC,DXLIST(DDB) ; top of unacknowledged queue
040 004 047 HRRZM TAC,PDBLNK(PDB) ; link PDB just output to the top
041 SKIPE TAC
042 004 049 HRLM PDB,PDBLNK(TAC) ; complete the binding
043 DLNDDB 002 040 MOVEM PDB,DXLIST(DDB) ; and update the unacknowledged queue
044 016 047 PUSHJ P,DLWAKE ; wake up user
045 024 007 JRST WRLIST
046
047 ; Here to back up in the list when it's retransmission time
048
049 004 047 WRPBKU: MOVE PDB,TAC ; make the previous THE current
050 004 047 HLRZ TAC,PDBLNK(PDB)
051 025 049 JUMPN TAC,WRPBKU
052 DLNDDB 002 039 MOVEM PDB,DOLIST(DDB) ; declare this to be the real start of the list
053 024 009 JRST WRLSTX
␈↓& I-level subroutines DLNSER[S,SYS] 08/14/78 Page 26␈↓'α
001 ;DLNICH DLNOCH DLNOC1 DLNRCH DLNDIL DLNLGR CHKBYT
002
003 SUBTTL I-level subroutines
004
005 ; Input a character coroutine
006
007 DLNDDB 002 031 DLNICH: MOVEM TAC,DIDS(DDB) ; save PC of caller
008 POPJ P,
009
010 ; Output a character coroutine
011
012 004 042 DLNOCH: MOVEI TAC1,DS%ODE ; maybe have to do a DLE again?
013 004 007 CAIN CHR,%DLE
014 DLNDDB 002 030 IORM TAC1,DSTAT(DDB) ; yes, remember that
015 DLNDDB 002 032 DLNOC1: MOVEM TAC,DODS(DDB) ; save PC of caller
016 LDB TAC,PUNIT ; TAC ← Dialnet unit number
017 JRST DLNTYP
018
019 ; Get a single byte into DREP in the DDB (for getting a dialing reply)
020
021 DLNDDB 002 047 DLNRCH: MOVEM CHR,DREP(DDB) ; save character
022 MOVEI TAC,CPOPJ ; stop I-level
023 DLNDDB 002 031 MOVEM TAC,DIDS(DDB)
024 016 047 JRST DLWAKE
025
026 ; Here to dial phone number
027
028 DLNDDB 002 046 DLNDIL: MOVE TAC,[440700,,DNUM(DDB)] ; pointer to phone number
029 DLNDDB 002 045 MOVEM TAC,DNUMP(DDB)
030 MOVEI CHR,"α" ; start transaction
031 026 012 JSP TAC,DLNOCH
032 DLNDDB 002 045 ILDB CHR,DNUMP(DDB) ; get phone number byte
033 026 012 JUMPN CHR,[JSP TAC,DLNOCH ↔ JRST .-1]
034 MOVEI CHR,"∂" ; end of buffer
035 026 012 JSP TAC,DLNOCH
036 MOVEI CHR,"β" ; start dialing
037 LDB TAC,PUNIT
038 026 012 JSP TAC,DLNOCH
039 MOVEI TAC,CPOPJ ; stop output I-level
040 DLNDDB 002 032 MOVEM TAC,DODS(DDB)
041 026 021 MOVEI TAC,DLNRCH ; and start input
042 DLNDDB 002 031 MOVEM TAC,DIDS(DDB)
043 POPJ P,
044
045 ; Fire up the Dialnet logger
046
047 DLNLGR: MOVEI TAC,['DLNLGR' ↔ 'NETSYS' ↔ LUPPRV,,]
048 PUSHJ P,FIREUP ; wake up DLNLGR
049 JRST [ MOVSI TAC,DLNLGR; failed, try again later
050 CONO PI,PIOFF
051 IDPB TAC,CLKQ
052 CONO PI,PION
053 POPJ P,]
054 POPJ P,
055
056 ; Add a byte to the checksum in the PDB's PDBCHK
057 ; Algorithm: while CHR do SUM ← (SUM*013215) + CHR;
058 ; MOVE CHR,<byte from data stream>
059 ; PUSHJ P,CHKBYT
060 ; <return>
061 ; At the beginning of each packet PDBCHK must be initialized to 1.
062
063 004 047 CHKBYT: MOVE TAC,PDBCHK(PDB)
064 IMULI TAC,013215 ; Dialnet black magic number
065 ADDI TAC,(CHR)
066 004 047 HRRZM TAC,PDBCHK(PDB)
067 POPJ P,
␈↓& I-level subroutines DLNSER[S,SYS] 08/14/78 Page 27␈↓'α
001 ;SNDERR SNDERL SNDER1
002
003 ; Send an error message to the other place.
004 ; PUSHJ P,SNDERR
005 ; ASCIZ/...message.../
006 ; <return>
007
008 004 047 SNDERR: PUSH P,PDB
009 DLNDDB 002 042 SKIPLE DOWIN(DDB) ; make sure the window is open
010 005 025 PUSHJ P,MAKPDB ; get a PDB to frob
011 027 028 JRST SNDER1
012 004 023 MOVEI TAC,%ERR ; error type packet
013 004 061 DPB TAC,PKTOPC
014 004 066 MOVE TAC1,PKTDAT ; pointer to data area
015 SETZ DAT,
016 HRRZ TAC,-1(P) ; addr of string
017 TLOA TAC,440700 ; make byte pointer
018 SNDERL: IDPB CHR,TAC1
019 ILDB CHR,TAC ; gobble down character of message
020 SKIPE CHR
021 027 018 AOJA DAT,SNDERL
022 004 064 DPB DAT,PKTSIZ
023 AOS TAC
024 HRRM TAC,-1(P) ; set return PC after the message
025 017 026 PUSHJ P,DLOUTQ ; make PDB available for output
026 004 047 POP P,PDB
027 POPJ P,
028 SNDER1: HRRZ TAC,-1(P) ; better find that return right!
029 HRLI TAC,440700
030 ILDB CHR,TAC
031 JUMPN CHR,.-1
032 AOS TAC
033 HRRM TAC,-1(P)
034 004 047 POP P,PDB
035 POPJ P,
␈↓& I-level interface with TTYSER DLNSER[S,SYS] 08/14/78 Page 28␈↓'α
001 ;DLIINT DLOINT
002
003 SUBTTL I-level interface with TTYSER
004
005 ; Input interrupt; device index in TAC, character in CHR. I hope you have as
006 ; much fun reading this routine as I had writing it.
007
008 ↑DLIINT:SKIPL TAC ; demand a good index
009 CAIL TAC,DLNNUM ; 0≤index≤DLNNUM-1
010 030 027 JSP TAC1,BADDLU ; bad Dialnet unit
011 DLNDDB 002 057 MOVE DDB,DLNUTB(TAC) ; get DDB
012 DLNDDB 002 030 MOVE TAC,DSTAT(DDB) ; get status bits
013 004 036 TRNN TAC,DS%IEN ; I-level enabled for this DDB?
014 POPJ P,
015 DLNDDB 002 037 SKIPN PDB,INTPDB(DDB) ; set up packet pointer
016 004 047 MOVEI PDB,654321 ; cause immediate exec page fault if losing
017 ANDI CHR,377 ; goddamned bagbiting status bits!!
018 004 038 TRZE TAC,DS%DLE ; previous character a DLE?
019 004 039 JRST [ TRZE TAC,DS%EOP ; have EOP permission?
020 004 009 CAIE CHR,%ETX ; end of packet
021 004 011 CAIN CHR,%STX ; start of packet
022 020 005 PUSH P,[RDPCKT ↔ RDPDUN]-%STX(CHR) ; knows that ETX = STX +1
023 DLNDDB 002 030 MOVEM TAC,DSTAT(DDB) ; set status flags
024 004 007 CAIN CHR,%DLE ; quoted DLE?
025 DLNDDB 002 031 JRST @DIDS(DDB)
026 POPJ P,]
027 004 007 CAIE CHR,%DLE ; if not DLE
028 004 039 TRZA TAC,DS%EOP ; then deny EOP permission
029 004 038 TROA TAC,DS%DLE ; else set "previous was DLE"
030 DLNDDB 002 031 PUSH P,DIDS(DDB) ; else interpret as normal character
031 DLNDDB 002 030 MOVEM TAC,DSTAT(DDB)
032 POPJ P,
033
034 ; Output interrupt; device index in TAC
035
036 ↑DLOINT:SKIPL TAC ; demand a good index
037 CAIL TAC,DLNNUM
038 030 027 JSP TAC1,BADDLU
039 DLNDDB 002 057 MOVE DDB,DLNUTB(TAC) ; get DDB
040 DLNDDB 002 030 MOVE TAC1,DSTAT(DDB)
041 004 036 TRNN TAC1,DS%IEN ; flush if locked out
042 POPJ P,
043 004 042 TRZE TAC1,DS%ODE ; time to double a DLE?
044 DLNDDB 002 030 JRST [ MOVEM TAC1,DSTAT(DDB) ; yes, flag it done
045 004 007 MOVEI CHR,%DLE
046 JRST DLNTYP] ; and skip the coroutine this time around
047 DLNDDB 002 039 SKIPN PDB,DOLIST(DDB) ; set up packet pointer
048 004 047 MOVEI PDB,654321 ; cause immediate exec page fault if losing
049 DLNDDB 002 032 JRST @DODS(DDB) ; back to output loop
␈↓& I-level interface with TTYSER DLNSER[S,SYS] 08/14/78 Page 29␈↓'α
001 ;DLPINT DLHINT
002
003 ; Pick-up interrupt. Flag the line as having carrier
004
005 ↑DLPINT:SKIPL TAC ; demand a good index
006 CAIL TAC,DLNNUM
007 030 027 JSP TAC1,BADDLU
008 DLNDDB 002 057 MOVE DDB,DLNUTB(TAC) ; get DDB
009 004 040 MOVEI TAC,DS%CCR ; flag carrier on this line
010 DLNDDB 002 030 IORM TAC,DSTAT(DDB)
011 POPJ P,
012
013 ; Hang-up interrupt
014
015 ↑DLHINT:SKIPL TAC ; demand a good index
016 CAIL TAC,DLNNUM
017 030 027 JSP TAC1,BADDLU
018 DLNDDB 002 057 MOVE DDB,DLNUTB(TAC) ; get DDB
019 004 040 MOVEI TAC,DS%CCR
020 DLNDDB 002 030 ANDCAB TAC,DSTAT(DDB)
021 004 036 TRNN TAC,DS%IEN ; I-level enabled for this DDB?
022 POPJ P,
023 MOVEI TAC,CPOPJ
024 DLNDDB 002 031 MOVEM TAC,DIDS(DDB)
025 DLNDDB 002 032 MOVEM TAC,DODS(DDB)
026 DLNDDB 002 043 SETZM DACK(DDB) ; try to avoid packet number lossage
027 DLNDDB 002 044 SETZM DSEQ(DDB)
028 DLNDDB 002 033 SETZM DPID(DDB) ; clear PID no matter what
029 DLNDDB 002 033 SETZM DPID+1(DDB)
030 005 025 PUSHJ P,MAKPDB
031 POPJ P,
032 004 017 MOVEI TAC,%CLS ; in case saved in input list
033 004 061 DPB TAC,PKTOPC
034 023 038 JRST RDPCLS ; and fake having read in a CLS
␈↓& Bug traps DLNSER[S,SYS] 08/14/78 Page 30␈↓'α
001 ;DLNBUG BADDLU
002
003 SUBTTL Bug traps
004
005 ; Here to report a Dialnet bug
006 ; <bug trap instruction, skip if no bug>
007 ; PUSHJ P,DLNBUG
008 ; Re-executes the losing instruction
009
010 DLNBUG: SOS (P) ; make it come back to the instruction
011 SOS (P) ; which screwed us, so CPOPJ$G will retry
012 PUSHACS
013 PUSHJ P,DISDATE
014 PUSHJ P,DISERR
015 [ASCIZ/DIALNET BUG TRAP AT /]
016 DISARG LOC,<-21(P)>
017 [ASCIZ/. FIND MRC BEFORE DOING ANYTHING.
018 /]
019 -1
020 PUSHJ P,DISFLUSH
021 POPACS
022 JRST WDDTCAL
023
024 ; Here when Brian bit the bag and gave us a bad index, called via
025 ; JSP TAC1,BADDLU with losing index in TAC.
026
027 ↑BADDLU:PUSHACS
028 PUSHJ P,DISDATE
029 PUSHJ P,DISERR
030 030 032 [ASCIZ/ILLEGAL DIALNET INDEX AT I-LEVEL, CALLER=/]
031 DISARG LOC,<-20+TAC1(P)>
032 [ASCIZ/, INDEX=/]
033 DISARG LOC,<-20+TAC(P)>
034 [ASCIZ/
035 /]
036 -1
037 PUSHJ P,DISFLUSH
038 POPACS
039 JRST WDDTCAL
040
041 >; IFN FTDLN
042
043 002 001 BEND DLNSER
Symbol Table for: DLNSER[S,SYS] 08/14/78 Page I
%CLS ← 004 017 DLIEOF 009 041 DLNOC1 026 015 DS%CON ← 004 035 PDFILL 005 043 RDPNRT 020 049
%DLE ← 004 007 DLIINR 009 040 DLNOCH 026 012 DS%DLE ← 004 038 PKTACK 004 063 RDPPAK 021 005
%EOF ← 004 021 DLIINT 028*008 DLNOUT 010 012 DS%EOP ← 004 039 PKTCHN 004 060 RDPPK0 021 018
%ERR ← 004 023 DLILUP 008 022 DLNRCH 026 021 DS%IDL ← 004 037 PKTCOP 004 059 RDPRPC 023 005
%ETX ← 004 009 DLIMSG 009 007 DLNRLS 007 028 DS%IEN ← 004 036 PKTDAT 004 066 RDPSIW 020 009
%INT ← 004 022 DLMLUP 009 011 DLNRPA 013 014 DS%ODE ← 004 042 PKTFDA 004 067 RDPWIN 022 021
%MSG ← 004 019 DLNBUG 030 010 DLNRPC 012 014 DXHANG 016 007 PKTOPC 004 061 RDPWN1 022 022
%NAK ← 004 020 DLNCL1 018 015 DLNRWN 013 029 FLSPDB 006 039 PKTSDA 004*068 RDRPC2 023 031
%NOP = 004*025 DLNCL2 018 038 DLNSER B 002 001 GETARG 017 006 PKTSEQ 004 062 REPFLX 005 056
%NOP ← 004*015 DLNCLK 018 010 DLNSTA 015 035 INDEX = 030 032 PKTSIZ 004 064 REPFPL 005 050
%RPC ← 004 016 DLNCLS 014 010 DLNWIN 014 035 INTTAB 021 037 PKTWNS 004 070 REVPDB 022 052
%STX = 004 011 DLNCWA 015 054 DLOINT 028*036 MAKPD1 005 034 RDPCKN 020 030 SNDER1 027 028
%STX ← 004 008 DLNDIL 026 028 DLOLUP 010 036 MAKPD2 005 039 RDPCKT 019 008 SNDERL 027 018
%WIN ← 004 018 DLNDSP 002*016 DLONEW 010*021 MAKPDB 005 025 RDPCKX 019 013 SNDERR 027 008
BADDLU 030 027 DLNEOF 014 056 DLOOLD 010 032 NORPC 017 016 RDPCL1 023 047 SNDNOP 013*005
CALLER = 030*030 DLNICH 026 007 DLOOUT 010 055 OPMAX ← 008 049 RDPCLS 023 038 UUOTAB 008 040
CHKBYT 026 063 DLNIN1 007 014 DLOOUX 010 064 PDB ← 004 047 RDPDAT 019 030 WINDEF ← 004 030
CLRPDB 006 009 DLNINI 007 007 DLOUQ1 017 033 PDBCHK ← 004 052 RDPDUN 020 005 WINMAX ← 004 031
DCHLUZ 017 021 DLNINP 008 016 DLOUTQ 017 026 PDBCNT ← 004 050 RDPERR 022 070 WINMIN ← 004 029
DCWAIT 016 026 DLNINT 015 009 DLPINT 029*005 PDBDAT ← 004 054 RDPFAK 020 017 WRLIST 024 007
DCWAKE 016 045 DLNLGR 026 047 DLRCON 012 027 PDBGET 005 010 RDPINT 022 037 WRLSTX 024 009
DLDINI 007 043 DLNMDS 011 010 DLWAIT 016 032 PDBHDR ← 004 053 RDPMSG 022 005 WRPBKU 025 049
DLHANG 016 013 DLNMMX ← 011 018 DLWAKE 016 047 PDBLNK ← 004 049 RDPNAK 022 048 WRPDAT 025 003
DLHINT 029*015 DLNMSG M 003 010 DS%ACN ← 004 041 PDBPNT ← 004 051 RDPNOP 021 031 WRPMOR 025 035
DLICLS 009 028 DLNMTP 011 005 DS%CCR ← 004 040 PDBSIZ ← 004 055 RDPNPK 021 017 WRPSOP 024 025
DLIDSC 008 031
SAIL MRC 09:05:20 Monday, August 14, 1978 FQ+3D.9H.17M.25S.
DLNDDB[S,SYS] Created 00:30 Sunday, August 13, 1978 FQ+2D.0H.42M.5S.
DDDDDDDDD LLL NNN NNN DDDDDDDDD DDDDDDDDD BBBBBBBBBBBB
DDDDDDDDD LLL NNN NNN DDDDDDDDD DDDDDDDDD BBBBBBBBBBBB
DDDDDDDDD LLL NNN NNN DDDDDDDDD DDDDDDDDD BBBBBBBBBBBB
DDD DDD LLL NNNNNN NNN DDD DDD DDD DDD BBB BBB
DDD DDD LLL NNNNNN NNN DDD DDD DDD DDD BBB BBB
DDD DDD LLL NNNNNN NNN DDD DDD DDD DDD BBB BBB
DDD DDD LLL NNN NNN NNN DDD DDD DDD DDD BBB BBB
DDD DDD LLL NNN NNN NNN DDD DDD DDD DDD BBB BBB
DDD DDD LLL NNN NNN NNN DDD DDD DDD DDD BBB BBB
DDD DDD LLL NNN NNNNNN DDD DDD DDD DDD BBBBBBBBBBBB
DDD DDD LLL NNN NNNNNN DDD DDD DDD DDD BBBBBBBBBBBB
DDD DDD LLL NNN NNNNNN DDD DDD DDD DDD BBBBBBBBBBBB
DDD DDD LLL NNN NNN DDD DDD DDD DDD BBB BBB
DDD DDD LLL NNN NNN DDD DDD DDD DDD BBB BBB
DDD DDD LLL NNN NNN DDD DDD DDD DDD BBB BBB
DDD DDD LLL NNN NNN DDD DDD DDD DDD BBB BBB
DDD DDD LLL NNN NNN DDD DDD DDD DDD BBB BBB
DDD DDD LLL NNN NNN DDD DDD DDD DDD BBB BBB
DDDDDDDDD LLLLLLLLLLLLLLL NNN NNN DDDDDDDDD DDDDDDDDD BBBBBBBBBBBB
DDDDDDDDD LLLLLLLLLLLLLLL NNN NNN DDDDDDDDD DDDDDDDDD BBBBBBBBBBBB
DDDDDDDDD LLLLLLLLLLLLLLL NNN NNN DDDDDDDDD DDDDDDDDD BBBBBBBBBBBB
SAIL MRC 09:05:20 Monday, August 14, 1978 FQ+3D.9H.17M.25S.
DLNDDB[S,SYS] Created 00:30 Sunday, August 13, 1978 FQ+2D.0H.42M.5S.
DLNSER[S,SYS] DLNDDB[S,SYS]
Switch Settings: L[FAIL] % C S 78V 120W X ↑
Fonts: F[FIX20.FNT[XGP,SYS],,]
␈↓&DLNDDB[S,SYS] 08/14/78 Page 1␈↓'α
001 COMMENT ⊗ VALID 00002 PAGES
002 C REC PAGE DESCRIPTION
003 C00001 00001
004 C00002 00002 BEGIN DLNDDB ↔ SUBTTL DLNDDB Dialnet DDB and Data Area
005 C00006 ENDMK
006 C⊗;
␈↓&DLNDDB[S,SYS] 08/14/78 Page 2␈↓'α
001 BEGIN DLNDDB ↔ SUBTTL DLNDDB Dialnet DDB and Data Area
002 ; Mark Crispin, August '78
003
004 .AUXIL
005
006 IFN FTDLN,<
007
008 ; DDB for DLN device
009
010 GLOBAL LPTDDB
011 002 010 DLINK←←LPTDDB ; link to LPT
012 UNIT←←DLNNUM ; initialize unit counter
013
014 DEFINE DEV'(X)<IFE X,<↑DLNDDB:>↑DL'X'DDB:IFN DLNNUM-1,<SIXBIT/DLN'X/;>SIXBIT/DLN/>
015 DEFINE DLNUTX'(X)<DL'X'DDB>
016
017 REPEAT DLNNUM,<
018 002 012 UNIT←←UNIT-1
019 DEVIBF,,0 ; DEVCMR
020 002 012 DEV(\UNIT) ; DEVNAM
021 002 012 UNIT⊗PUNITP ; DEVCHR
022 0 ; DEVIOS
023 DLNSER 002 016 DLINK,,DLNDSP ; DEVSER
024 DVLNG!DVIN!DVOUT,,100000; DEVMOD
025 BLOCK 4 ; DEVLOG/DEVBUF/DEVIAD/DEVOAD
026 PHASE DEVOAD+1
027 ↑NINPKT:BLOCK 1 ; # of packets read
028 ↑NOUPKT:BLOCK 1 ; # of packets sent
029 ↑DFWC←←. ; first word cleared at DLDINI
030 ↑DSTAT: BLOCK 1 ; status bits (first word zeroed at DDB init)
031 ↑DIDS: BLOCK 1 ; I-level input coroutine PC
032 ↑DODS: BLOCK 1 ; I-level output coroutine PC
033 ↑DPID: BLOCK 2 ; Dialnet PID
034 ↑DIWS: BLOCK 1 ; input window size
035 ↑DOWS: BLOCK 1 ; output window size (must be after DIWS)
036 ↑UUOPDB:BLOCK 1 ; UUO PDB
037 ↑INTPDB:BLOCK 1 ; I-level PDB
038 ↑DILIST:BLOCK 1 ; input PDB list
039 ↑DOLIST:BLOCK 1 ; output PDB list
040 ↑DXLIST:BLOCK 1 ; acknowledgement pending PDB list
041 ↑DIWIN: BLOCK 1 ; input window free
042 ↑DOWIN: BLOCK 1 ; output window free (must be after DIWIN)
043 ↑DACK: BLOCK 1 ; last consecutive packet received
044 ↑DSEQ: BLOCK 1 ; current output packet sequence number
045 ↑DNUMP: BLOCK 1 ; pointer to phone number
046 ↑DNUM: BLOCK 4 ; phone number
047 ↑DREP: BLOCK 1 ; dialing reply
048 ↑DLWC←←.-1 ; last word cleared at DLDINI
049 DEPHASE
050 002 012 DLINK←←DLNUTX(\UNIT)
051 >
052
053 002 048 ↑DLNDLN←←DLWC+2 ; size of DDB
054
055 ; Unit/DDB conversion table for I-level routines.
056
057 002 012 ↑DLNUTB:REPEAT DLNNUM,<DLNUTX(\UNIT) ↔ UNIT←←UNIT+1>
058
059 ; PDB free list stuff
060
061 ↑PDBFL: BLOCK 1 ; PDB free list
062 ↑PDBFLN:BLOCK 1 ; < 0 → number of PDB's PDBFL wants to get
063 ; = 0 → PDBFL is content
064 ; > 0 → number to drop (can be caused by
065 ; timing errors)
066 >;IFN FTDLN
067
068 002 001 BEND DLNDDB
Symbol Table for: DLNDDB[S,SYS] 08/14/78 Page I
DACK 002 043 DIWS 002 034 DLNUTX M 002 015 DOWIN 002 042 DXLIST 002 040 PDBFLN 002 062
DEV M 002 014 DLINK ← 002 011 DLWC ← 002 048 DOWS 002 035 INTPDB 002 037 UNIT ← 002 012
DFWC ← 002 029 DLINK ← 002 050 DNUM 002 046 DPID 002 033 LPTDDB G 002 010 UNIT ← 002 018
DIDS 002 031 DLNDDB B 002 001 DNUMP 002 045 DREP 002 047 NINPKT 002 027 UNIT ← 002 057
DILIST 002 038 DLNDLN ← 002*053 DODS 002 032 DSEQ 002 044 NOUPKT 002 028 UUOPDB 002 036
DIWIN 002 041 DLNUTB 002 057 DOLIST 002 039 DSTAT 002 030 PDBFL 002 061
Cref of: DLNSER[S,SYS] DLNDDB[S,SYS] 08/14/78 Page I
Key to types of symbol occurrences (Note references come last):
Dash - Reference. : - Label. ← - Assignment.
= - OPDEF or SYN. + - Macro. * - Block. # - Variable. ↑ - Global.
%CLS DLNSER 004←017 014-018 029-032
%DLE DLNSER 004←007 024-027 025-012 026-013 028-024 028-027 028-045
%EOF DLNSER 004←021 014-068
%ERR DLNSER 004←023 017-028 024-017 027-012
%ETX DLNSER 004←009 004-011 004-011 025-014 028-020
%INT DLNSER 004←022 015-020
%MSG DLNSER 004←019 010-030
%NAK DLNSER 004←020 017-029 020-046 024-018
%NOP DLNSER 004=025 004←015
%RPC DLNSER 004←016 013-019
%STX DLNSER 004=011 004←008 024-029 028-021 028-022
%WIN DLNSER 004←018 014-039
BADDLU DLNSER 030:027 028-010 028-038 029-007 029-017
CALLER DLNSER 030=030
CHKBYT DLNSER 026:063 019-016 019-019 019-022 019-025 019-031 024-032 024-035 024-039 024-044 025-004
CLRPDB DLNSER 006:009 006-041 007-011 007-036 007-038 008-036 010-061 010-068 019-049 020-027 021-032 022-049 023-052
023-053
DACK DLNDDB 002:043 DLNSER 020-033 021-005 024-037 029-026
DCHLUZ DLNSER 017:021 014-058 015-011
DCWAIT DLNSER 016:026 012-041
DCWAKE DLNSER 016:045 016-028
DEV DLNDDB 002+014 002-020
DFWC DLNDDB 002←029 DLNSER 007-051 007-052 007-053
DIDS DLNDDB 002:031 DLNSER 007-061 012-045 019-047 020-010 026-007 026-023 026-042 028-025 028-030 029-024
DILIST DLNDDB 002:038 DLNSER 007-029 008-022 008-034 022-011 022-015
DIWIN DLNDDB 002:041 DLNSER 007-059 008-031 013-038 020-006 021-031 022-048
DIWS DLNDDB 002:034 DLNSER 007-058 013-035 013-036 014-046 014-047 015-039
DLDINI DLNSER 007:043 007-016
DLHANG DLNSER 016:013 008-023 010-040
DLHINT DLNSER 029:015
DLICLS DLNSER 009:028 008-042
DLIDSC DLNSER 008:031 009-014 009-023 009-035 009-045
DLIEOF DLNSER 009:041 008-046
DLIINR DLNSER 009:040 008-047
DLIINT DLNSER 028:008
DLILUP DLNSER 008:022 009-016
DLIMSG DLNSER 009:007 008-044
DLINK DLNDDB 002←011 002←050 002-023
DLMLUP DLNSER 009:011 009-019
DLNBUG DLNSER 030:010 006-010 006-012 006-016 007-010 008-027 010-022 012-038 013-006 013-009 013-018 014-017 014-038
014-066 015-018 017-032 018-022 021-014 024-011
DLNCL1 DLNSER 018:015 018-039
DLNCL2 DLNSER 018:038 018-020 018-027 018-029
DLNCLK DLNSER 018:010 007-020
DLNCLS DLNSER 014:010 002-017 009-029 011-011
DLNCWA DLNSER 015:054 011-017 015-061
DLNDDB DLNDDB 002*001 002-068
DLNDIL DLNSER 026:028 012-057
DLNDLN DLNDDB 002←053
DLNDSP DLNSER 002:016 DLNDDB 002-023
DLNEOF DLNSER 014:056 011-013
DLNICH DLNSER 026:007 019-015 019-018 019-021 019-024 019-030 019-037 019-039 019-045
DLNIN1 DLNSER 007:014 007-018
DLNINI DLNSER 007:007 002-014
DLNINP DLNSER 008:016 002-023
DLNINT DLNSER 015:009 011-014
DLNLGR DLNSER 026:047 023-031
DLNMDS DLNSER 011:010 011-008 011-018
DLNMMX DLNSER 011←018 011-006
DLNMSG DLNSER 003+010 020-008 021-028 022-007 022-024 022-070 023-007 023-021 023-026
DLNMTP DLNSER 011:005 002-030
DLNOC1 DLNSER 026:015 024-028 025-013
DLNOCH DLNSER 026:012 012-047 024-030 024-033 024-036 024-042 024-046 025-005 025-009 025-011 025-015 026-031 026-033
026-035 026-038
DLNOUT DLNSER 010:012 002-022
DLNRCH DLNSER 026:021 012-044 026-041
DLNRLS DLNSER 007:028 002-016 023-054
DLNRPA DLNSER 013:014 012-023 012-031
DLNRPC DLNSER 012:014 011-010
Cref of: DLNSER[S,SYS] DLNDDB[S,SYS] 08/14/78 Page II
DLNRWN DLNSER 013:029 013-027
DLNSER DLNSER 002*001 004-011 004-025 030-043
DLNSTA DLNSER 015:035 011-016
DLNUTB DLNDDB 002:057 DLNSER 007-014 016-046 018-015 028-011 028-039 029-008 029-018
DLNUTX DLNDDB 002+015 002-050 002-057
DLNWIN DLNSER 014:035 011-012
DLOINT DLNSER 028:036
DLOLUP DLNSER 010:036 010-047
DLONEW DLNSER 010:021
DLOOLD DLNSER 010:032 010-020
DLOOUT DLNSER 010:055 011-015 014-013 014-062
DLOOUX DLNSER 010:064 010-041
DLOUQ1 DLNSER 017:033 017-027 017-030
DLOUTQ DLNSER 017:026 010-070 013-007 013-010 013-039 014-022 014-048 014-070 015-022 018-028 020-048 027-025
DLPINT DLNSER 029:005
DLRCON DLNSER 012:027 012-021
DLWAIT DLNSER 016:032 012-048 012-058 015-060 016-009 016-021
DLWAKE DLNSER 016:047 021-033 022-017 022-051 022-063 022-066 025-044 026-024
DLWC DLNDDB 002←048 DLNSER 007-054 DLNDDB 002-053
DNUM DLNDDB 002:046 DLNSER 012-054 012-056 015-041 015-043 026-028
DNUMP DLNDDB 002:045 DLNSER 026-029 026-032
DODS DLNDDB 002:032 DLNSER 007-062 025-018 026-015 026-040 028-049 029-025
DOLIST DLNDDB 002:039 DLNSER 007-031 017-033 017-037 018-021 018-035 021-013 021-015 022-060 022-061 024-007 025-025
025-033 025-052 028-047
DOWIN DLNDDB 002:042 DLNSER 010-039 010-062 013-015 014-014 014-035 014-063 015-015 017-031 020-028 020-043 022-032
027-009
DOWS DLNDDB 002:035 DLNSER 022-029 022-030
DPID DLNDDB 002:033 DLNSER 009-031 009-032 010-015 010-016 010-057 010-058 012-018 013-028 014-023 014-025 015-037
015-057 015-058 023-012 023-013 023-019 023-020 023-030 023-050 023-051 029-028 029-029
DREP DLNDDB 002:047 DLNSER 012-049 012-059 026-021
DS%ACN DLNSER 004←041 021-006 024-040 025-027
DS%CCR DLNSER 004←040 012-032 018-019 021-023 029-009 029-019
DS%CON DLNSER 004←035 008-016 010-012 012-014 013-025 014-010 014-020 014-059 015-012 015-054 016-015 022-005 023-005
023-014 023-047
DS%DLE DLNSER 004←038 028-018 028-029
DS%EOP DLNSER 004←039 019-042 028-019 028-028
DS%IDL DLNSER 004←037 007-063 012-036 017-041 018-018 021-009 024-009 025-019
DS%IEN DLNSER 004←036 007-063 028-013 028-041 029-021
DS%ODE DLNSER 004←042 026-012 028-043
DSEQ DLNDDB 002:044 DLNSER 024-020 024-024 029-027
DSTAT DLNDDB 002:030 DLNSER 007-028 007-064 008-017 010-013 012-015 012-033 012-037 013-026 014-011 014-021 014-060
015-013 015-035 015-055 016-016 017-042 018-017 019-044 021-007 021-010 021-024 022-006 023-006 023-015 023-018
023-048 024-010 024-012 024-041 025-020 025-028 026-014 028-012 028-023 028-031 028-040 028-044 029-010 029-020
DXHANG DLNSER 016:007 010-063 013-016 014-015 014-024 014-026 014-036 014-064 015-016
DXLIST DLNDDB 002:040 DLNSER 007-033 018-024 018-034 020-015 020-024 022-050 022-056 022-058 022-059 025-039 025-043
FLSPDB DLNSER 006:039 006-040 007-030 007-032 007-034
GETARG DLNSER 017:006 008-019 009-015 010-032 010-042
INDEX DLNSER 030=032 030-030
INTPDB DLNDDB 002:037 DLNSER 007-037 019-008 019-012 019-048 020-011 028-015
INTTAB DLNSER 021:037 021-027 021-047 021-047
LPTDDB DLNDDB 002↑010 002-011
MAKPD1 DLNSER 005:034 005-038
MAKPD2 DLNSER 005:039 005-035
MAKPDB DLNSER 005:025 007-009 010-021 013-005 013-008 013-017 014-016 014-037 014-065 015-017 018-026 019-010 020-044
021-011 025-031 027-010 029-030
NINPKT DLNDDB 002:027 DLNSER 020-005
NORPC DLNSER 017:016 008-018 010-014 014-061 015-014
NOUPKT DLNDDB 002:028 DLNSER 025-016
OPMAX DLNSER 008←049 008-025 021-026 021-047
PDB DLNSER 004←047 003-024 003-024 004-059 004-060 004-061 004-062 004-063 004-064 004-066 004-067 004-068 004-070
005-013 005-014 005-015 005-016 005-026 005-034 005-036 005-037 005-043 005-045 005-057 005-058 006-009 006-011
006-014 006-023 006-029 006-030 006-031 006-032 006-034 006-039 006-040 006-042 007-029 007-031 007-033 007-035
007-037 008-022 008-033 009-011 009-017 009-022 009-028 009-030 010-019 010-023 010-027 010-029 010-036 010-046
010-050 010-055 010-066 010-067 013-029 016-034 016-040 017-038 017-039 018-024 018-030 018-031 018-035 019-008
019-012 019-014 019-027 019-029 019-032 019-033 019-036 019-038 019-041 020-012 020-015 020-019 020-019 020-020
020-022 020-026 020-029 020-030 020-042 020-049 021-008 021-015 021-017 021-019 021-022 022-014 022-016 022-050
022-052 022-053 022-053 022-054 022-056 022-057 022-061 023-011 024-007 024-026 024-045 024-048 025-003 025-006
025-008 025-010 025-021 025-023 025-030 025-033 025-034 025-040 025-042 025-043 025-049 025-050 025-052 026-063
026-066 027-008 027-026 027-034 028-015 028-016 028-047 028-048
PDBCHK DLNSER 004←052 004-053 019-014 019-036 019-038 019-041 024-026 025-008 025-010 026-063 026-066
PDBCNT DLNSER 004←050 004-051 009-011 009-022 010-027 010-036 010-050 010-066 010-067 019-027 019-033 021-022 024-045
025-006
PDBDAT DLNSER 004←054 004-055 004-066 004-067 004-068 004-070 013-029 023-011
PDBFL DLNDDB 002:061 DLNSER 005-026 005-033 005-057 005-058
PDBFLN DLNDDB 002:062 DLNSER 005-030 005-041 005-060 006-021 007-008
PDBGET DLNSER 005:010 005-028 005-050
Cref of: DLNSER[S,SYS] DLNDDB[S,SYS] 08/14/78 Page III
PDBHDR DLNSER 004←053 004-054 004-059 004-060 004-061 004-062 004-063 004-064
PDBLNK DLNSER 004←049 004-050 008-033 008-035 018-030 018-031 018-033 020-019 020-022 020-025 020-026 022-012 022-014
022-016 022-052 022-053 022-057 022-064 022-065 025-021 025-023 025-024 025-040 025-042 025-050
PDBPNT DLNSER 004←051 004-052 009-017 010-029 010-046 019-029 019-032 021-019 024-048 025-003
PDBSIZ DLNSER 004←055 005-010 005-016 006-032
PDFILL DLNSER 005:043 005-032
PKTACK DLNSER 004:063 019-023 020-013 024-038
PKTCHN DLNSER 004:060 009-007 009-043 010-025 010-034 014-067 015-019
PKTCOP DLNSER 004:059 019-017 024-031
PKTDAT DLNSER 004:066 010-028 019-028 021-018 022-070 024-047 027-014
PKTFDA DLNSER 004:067 014-045 022-021
PKTOPC DLNSER 004:061 008-024 010-031 013-020 014-019 014-040 014-069 015-021 017-026 020-047 021-025 024-015 027-013
029-033
PKTSDA DLNSER 004:068
PKTSEQ DLNSER 004:062 019-020 020-017 020-031 024-013 024-023 024-034 025-035
PKTSIZ DLNSER 004:064 010-069 013-022 019-026 021-020 024-043 027-022
PKTWNS DLNSER 004:070 013-034 023-032
RDPCKN DLNSER 020:030 020-014 020-016 020-021
RDPCKT DLNSER 019:008 028-022
RDPCKX DLNSER 019:013 019-009
RDPCL1 DLNSER 023:047 023-039 023-044
RDPCLS DLNSER 023:038 021-039 029-034
RDPDAT DLNSER 019:030 019-034
RDPDUN DLNSER 020:005 028-022
RDPERR DLNSER 022:070 021-045
RDPFAK DLNSER 020:017 020-020
RDPINT DLNSER 022:037 021-044
RDPMSG DLNSER 022:005 021-041 021-043 022-038 022-041 022-044 023-049
RDPNAK DLNSER 022:048 021-042
RDPNOP DLNSER 021:031 020-041 020-050 021-037 022-010 022-033 022-071 023-010 023-024 023-029 023-033
RDPNPK DLNSER 021:017 021-012
RDPNRT DLNSER 020:049 020-045
RDPPAK DLNSER 021:005 020-038
RDPPK0 DLNSER 021:018 020-032
RDPRPC DLNSER 023:005 021-038
RDPSIW DLNSER 020:009 020-007
RDPWIN DLNSER 022:021 021-040
RDPWN1 DLNSER 022:022 023-034
RDRPC2 DLNSER 023:031 023-017
REPFLX DLNSER 005:056 006-033
REPFPL DLNSER 005:050 005-044 005-061
REVPDB DLNSER 022:052 022-054
SNDER1 DLNSER 027:028 027-011
SNDERL DLNSER 027:018 027-021
SNDERR DLNSER 027:008 021-029 022-008 022-025 023-008 023-022 023-027
SNDNOP DLNSER 013:005
UNIT DLNDDB 002←012 002←018 002←057 002-018 002-020 002-021 002-050 002-057 002-057
UUOPDB DLNDDB 002:036 DLNSER 007-035 010-019 010-023 010-055 010-060 010-064
UUOTAB DLNSER 008:040 008-026 008-049
WINDEF DLNSER 004←030 013-033 014-044
WINMAX DLNSER 004←031 013-032 014-043 022-023
WINMIN DLNSER 004←029 007-056 007-057 013-031 014-042 022-022
WRLIST DLNSER 024:007 025-017 025-038 025-045
WRLSTX DLNSER 024:009 017-044 018-037 021-016 022-062 025-053
WRPBKU DLNSER 025:049 025-022 025-051
WRPDAT DLNSER 025:003 025-007
WRPMOR DLNSER 025:035 025-026 025-029
WRPSOP DLNSER 024:025 024-014 024-016 024-019